Skip to content

Commit

Permalink
Backport PR pandas-dev#35688 on branch 1.1.x: Fix pandas-devGH-29442
Browse files Browse the repository at this point in the history
…DataFrame.groupby doesn't preserve _metadata
  • Loading branch information
Japanuspus authored and simonjayhawkins committed Oct 14, 2020
1 parent 6ecd265 commit 9ad9221
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 5 deletions.
2 changes: 1 addition & 1 deletion doc/source/whatsnew/v1.1.4.rst
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Fixed regressions

Bug fixes
~~~~~~~~~
-
- Bug causing ``groupby(...).sum()`` and similar to not preserve metadata (:issue:`29442`)

.. ---------------------------------------------------------------------------
Expand Down
8 changes: 5 additions & 3 deletions pandas/core/groupby/groupby.py
Original file line number Diff line number Diff line change
Expand Up @@ -994,9 +994,10 @@ def _agg_general(
):
self._set_group_selection()

result = None
# try a cython aggregation if we can
try:
return self._cython_agg_general(
result = self._cython_agg_general(
how=alias, alt=npfunc, numeric_only=numeric_only, min_count=min_count,
)
except DataError:
Expand All @@ -1012,8 +1013,9 @@ def _agg_general(
raise

# apply a non-cython aggregation
result = self.aggregate(lambda x: npfunc(x, axis=self.axis))
return result
if result is None:
result = self.aggregate(lambda x: npfunc(x, axis=self.axis))
return result.__finalize__(self.obj, method="groupby")

def _cython_agg_general(
self, how: str, alt=None, numeric_only: bool = True, min_count: int = -1
Expand Down
16 changes: 15 additions & 1 deletion pandas/tests/generic/test_finalize.py
Original file line number Diff line number Diff line change
Expand Up @@ -778,13 +778,27 @@ def test_categorical_accessor(method):
[
operator.methodcaller("sum"),
lambda x: x.agg("sum"),
],
)
def test_groupby_finalize(obj, method):
obj.attrs = {"a": 1}
result = method(obj.groupby([0, 0]))
assert result.attrs == {"a": 1}


@pytest.mark.parametrize(
"obj", [pd.Series([0, 0]), pd.DataFrame({"A": [0, 1], "B": [1, 2]})]
)
@pytest.mark.parametrize(
"method",
[
lambda x: x.agg(["sum", "count"]),
lambda x: x.transform(lambda y: y),
lambda x: x.apply(lambda y: y),
],
)
@not_implemented_mark
def test_groupby(obj, method):
def test_groupby_finalize_not_implemented(obj, method):
obj.attrs = {"a": 1}
result = method(obj.groupby([0, 0]))
assert result.attrs == {"a": 1}

0 comments on commit 9ad9221

Please sign in to comment.