diff --git a/pandas/core/groupby/ops.py b/pandas/core/groupby/ops.py index 742de397956c0..47cce84836ed1 100644 --- a/pandas/core/groupby/ops.py +++ b/pandas/core/groupby/ops.py @@ -39,6 +39,7 @@ from pandas.core.dtypes.missing import _maybe_fill, isna import pandas.core.algorithms as algorithms +from pandas.core.arrays import Categorical from pandas.core.base import SelectionMixin import pandas.core.common as com from pandas.core.frame import DataFrame @@ -837,11 +838,22 @@ def names(self): @property def groupings(self) -> "List[grouper.Grouping]": + codes, _, _ = self.group_info + + if self.indexer is not None and len(self.indexer) != len(codes): + groupers = self.levels + else: + groupers = [self.result_index._constructor( + Categorical.from_codes(self.codes_info, self.result_index))] + return [ grouper.Grouping(lvl, lvl, in_axis=False, level=None, name=name) - for lvl, name in zip(self.levels, self.names) + for lvl, name in zip(groupers, self.names) ] + def __iter__(self): + return iter(self.groupings[0].grouper) + def agg_series(self, obj: Series, func): # Caller is responsible for checking ngroups != 0 assert self.ngroups != 0 diff --git a/pandas/tests/groupby/test_groupby.py b/pandas/tests/groupby/test_groupby.py index b8d8f56512a69..b3e8499c5daa5 100644 --- a/pandas/tests/groupby/test_groupby.py +++ b/pandas/tests/groupby/test_groupby.py @@ -1863,6 +1863,17 @@ def test_groupby_groups_in_BaseGrouper(): expected = df.groupby(["beta", "alpha"]) assert result.groups == expected.groups + # GH 33132 + # Test if DataFrame grouped with a pandas.Grouper and freq param has correct groups + mi = pd.MultiIndex.from_product([date_range(datetime.today(), periods=2), + ["C", "D"]], names=["alpha", "beta"]) + df = pd.DataFrame({"foo": [1, 2, 1, 2], "bar": [1, 2, 3, 4]}, index=mi) + result = df.groupby(["beta", pd.Grouper(level="alpha", freq='D')]) + assert result.ngroups == len(result) + + result = df.groupby([pd.Grouper(level="alpha", freq='D'), "beta"]) + assert result.ngroups == len(result) + @pytest.mark.parametrize("group_name", ["x", ["x"]]) def test_groupby_axis_1(group_name):