Skip to content

Commit

Permalink
BUG: RollingGroupby not respecting sort=False (#36911)
Browse files Browse the repository at this point in the history
* BUG: RollingGroupby not respecting sort

* move to 1.1.4

* Just use factorize

* Add comments and turn into dict comprenehsion

Co-authored-by: Matt Roeschke <mroeschke@housecanary.com>
  • Loading branch information
mroeschke and Matt Roeschke authored Oct 9, 2020
1 parent 90378ad commit 345efdd
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 2 deletions.
1 change: 1 addition & 0 deletions doc/source/whatsnew/v1.1.4.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ including other versions of pandas.
Fixed regressions
~~~~~~~~~~~~~~~~~
- Fixed regression where attempting to mutate a :class:`DateOffset` object would no longer raise an ``AttributeError`` (:issue:`36940`)
- Fixed regression in :class:`RollingGroupby` with ``sort=False`` not being respected (:issue:`36889`)

.. ---------------------------------------------------------------------------
Expand Down
9 changes: 7 additions & 2 deletions pandas/core/groupby/grouper.py
Original file line number Diff line number Diff line change
Expand Up @@ -563,8 +563,13 @@ def indices(self):
if isinstance(self.grouper, ops.BaseGrouper):
return self.grouper.indices

values = Categorical(self.grouper)
return values._reverse_indexer()
# Return a dictionary of {group label: [indices belonging to the group label]}
# respecting whether sort was specified
codes, uniques = algorithms.factorize(self.grouper, sort=self.sort)
return {
category: np.flatnonzero(codes == i)
for i, category in enumerate(Index(uniques))
}

@property
def codes(self) -> np.ndarray:
Expand Down
15 changes: 15 additions & 0 deletions pandas/tests/window/test_grouper.py
Original file line number Diff line number Diff line change
Expand Up @@ -457,3 +457,18 @@ def test_groupby_rolling_string_index(self):
columns=["index", "group", "eventTime", "count_to_date"],
).set_index(["group", "index"])
tm.assert_frame_equal(result, expected)

def test_groupby_rolling_no_sort(self):
# GH 36889
result = (
pd.DataFrame({"foo": [2, 1], "bar": [2, 1]})
.groupby("foo", sort=False)
.rolling(1)
.min()
)
expected = pd.DataFrame(
np.array([[2.0, 2.0], [1.0, 1.0]]),
columns=["foo", "bar"],
index=pd.MultiIndex.from_tuples([(2, 0), (1, 1)], names=["foo", None]),
)
tm.assert_frame_equal(result, expected)

0 comments on commit 345efdd

Please sign in to comment.