Skip to content

Commit 8e669d9

Browse files
author
Kei
committed
Add observed grouper/grouping as cached method
1 parent 8588a1e commit 8e669d9

File tree

4 files changed

+32
-17
lines changed

4 files changed

+32
-17
lines changed

pandas/core/groupby/generic.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2040,7 +2040,6 @@ def _gotitem(self, key, ndim: int, subset=None):
20402040
group_keys=self.group_keys,
20412041
observed=self.observed,
20422042
dropna=self.dropna,
2043-
observed_grouper=self.observed_grouper,
20442043
)
20452044
elif ndim == 1:
20462045
if subset is None:
@@ -2058,7 +2057,6 @@ def _gotitem(self, key, ndim: int, subset=None):
20582057
group_keys=self.group_keys,
20592058
observed=self.observed,
20602059
dropna=self.dropna,
2061-
observed_grouper=self.observed_grouper,
20622060
)
20632061

20642062
raise AssertionError("invalid ndim for _gotitem")

pandas/core/groupby/groupby.py

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,6 @@ class BaseGroupBy(PandasObject, SelectionMixin[NDFrameT], GroupByIndexingMixin):
588588
"obj",
589589
"observed",
590590
"sort",
591-
"observed_grouper",
592591
}
593592

594593
_grouper: ops.BaseGrouper
@@ -1107,7 +1106,6 @@ def __init__(
11071106
group_keys: bool = True,
11081107
observed: bool = False,
11091108
dropna: bool = True,
1110-
observed_grouper: ops.BaseGrouper | None = None,
11111109
) -> None:
11121110
self._selection = selection
11131111

@@ -1120,18 +1118,6 @@ def __init__(
11201118
self.group_keys = group_keys
11211119
self.dropna = dropna
11221120

1123-
if not observed and grouper is None:
1124-
observed_grouper, _, _ = get_grouper(
1125-
obj,
1126-
self.keys,
1127-
level=self.level,
1128-
sort=self.sort,
1129-
observed=True,
1130-
dropna=self.dropna,
1131-
)
1132-
1133-
self.observed_grouper = observed_grouper
1134-
11351121
if grouper is None:
11361122
grouper, exclusions, obj = get_grouper(
11371123
obj,
@@ -1899,7 +1885,7 @@ def _transform(self, func, *args, engine=None, engine_kwargs=None, **kwargs):
18991885

19001886
with (
19011887
com.temp_setattr(self, "observed", True),
1902-
com.temp_setattr(self, "_grouper", self.observed_grouper),
1888+
com.temp_setattr(self, "_grouper", self._grouper.observed_grouper),
19031889
):
19041890
return self._reduction_kernel_transform(
19051891
func, *args, engine=engine, engine_kwargs=engine_kwargs, **kwargs

pandas/core/groupby/grouper.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,24 @@ def groups(self) -> dict[Hashable, Index]:
668668
cats = Categorical.from_codes(codes, uniques, validate=False)
669669
return self._index.groupby(cats)
670670

671+
@cache_readonly
672+
def observed_grouping(self) -> Grouper:
673+
if self._observed:
674+
return self
675+
676+
grouping = Grouping(
677+
self._index,
678+
self._orig_grouper,
679+
obj=self.obj,
680+
level=self.level,
681+
sort=self._sort,
682+
observed=True,
683+
in_axis=self.in_axis,
684+
dropna=self._dropna,
685+
uniques=self._uniques,
686+
)
687+
return grouping
688+
671689

672690
def get_grouper(
673691
obj: NDFrameT,

pandas/core/groupby/ops.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,15 @@ def result_index_and_ids(self) -> tuple[Index, npt.NDArray[np.intp]]:
823823

824824
return result_index, ids
825825

826+
@cache_readonly
827+
def observed_grouper(self) -> BaseGrouper:
828+
if all(ping._observed for ping in self.groupings):
829+
return self
830+
831+
groupings = [ping.observed_grouping for ping in self.groupings]
832+
grouper = BaseGrouper(self.axis, groupings, sort=self._sort, dropna=self.dropna)
833+
return grouper
834+
826835
def _ob_index_and_ids(
827836
self,
828837
levels: list[Index],
@@ -1154,6 +1163,10 @@ def groupings(self) -> list[grouper.Grouping]:
11541163
)
11551164
return [ping]
11561165

1166+
@cache_readonly
1167+
def observed_grouper(self) -> BinGrouper:
1168+
return self
1169+
11571170

11581171
def _is_indexed_like(obj, axes) -> bool:
11591172
if isinstance(obj, Series):

0 commit comments

Comments
 (0)