@@ -586,9 +586,10 @@ class BaseGroupBy(PandasObject, SelectionMixin[NDFrameT], GroupByIndexingMixin):
586
586
"keys" ,
587
587
"level" ,
588
588
"obj" ,
589
- "orig_obj" ,
590
589
"observed" ,
591
590
"sort" ,
591
+ "observed_grouper" ,
592
+ "observed_exclusions" ,
592
593
}
593
594
594
595
_grouper : ops .BaseGrouper
@@ -1107,7 +1108,8 @@ def __init__(
1107
1108
group_keys : bool = True ,
1108
1109
observed : bool = False ,
1109
1110
dropna : bool = True ,
1110
- orig_obj : NDFrameT | None = None ,
1111
+ observed_grouper : ops .BaseGrouper | None = None ,
1112
+ observed_exclusions : frozenset [Hashable ] | None = None ,
1111
1113
) -> None :
1112
1114
self ._selection = selection
1113
1115
@@ -1119,8 +1121,8 @@ def __init__(
1119
1121
self .sort = sort
1120
1122
self .group_keys = group_keys
1121
1123
self .dropna = dropna
1122
- self .orig_obj = obj if orig_obj is None else orig_obj
1123
1124
1125
+ orig_obj = obj
1124
1126
if grouper is None :
1125
1127
grouper , exclusions , obj = get_grouper (
1126
1128
obj ,
@@ -1136,6 +1138,21 @@ def __init__(
1136
1138
self ._grouper = grouper
1137
1139
self .exclusions = frozenset (exclusions ) if exclusions else frozenset ()
1138
1140
1141
+ if not observed and observed_grouper is None :
1142
+ observed_grouper , observed_exclusions , _ = get_grouper (
1143
+ orig_obj ,
1144
+ self .keys ,
1145
+ level = self .level ,
1146
+ sort = self .sort ,
1147
+ observed = True ,
1148
+ dropna = self .dropna ,
1149
+ )
1150
+
1151
+ self .observed_grouper = observed_grouper
1152
+ self .observed_exclusions = (
1153
+ frozenset (observed_exclusions ) if observed_exclusions else frozenset ()
1154
+ )
1155
+
1139
1156
def __getattr__ (self , attr : str ):
1140
1157
if attr in self ._internal_names_set :
1141
1158
return object .__getattribute__ (self , attr )
@@ -1887,44 +1904,15 @@ def _transform(self, func, *args, engine=None, engine_kwargs=None, **kwargs):
1887
1904
func , * args , engine = engine , engine_kwargs = engine_kwargs , ** kwargs
1888
1905
)
1889
1906
1890
- grouper , exclusions , obj = get_grouper (
1891
- self .orig_obj ,
1892
- self .keys ,
1893
- level = self .level ,
1894
- sort = self .sort ,
1895
- observed = True ,
1896
- dropna = self .dropna ,
1897
- )
1898
- exclusions = frozenset (exclusions ) if exclusions else frozenset ()
1899
- obj_has_not_changed = self .orig_obj .equals (self .obj )
1900
-
1901
1907
with (
1902
1908
com .temp_setattr (self , "observed" , True ),
1903
- com .temp_setattr (self , "_grouper" , grouper ),
1904
- com .temp_setattr (self , "exclusions" , exclusions ),
1905
- com .temp_setattr (self , "obj" , obj , condition = obj_has_not_changed ),
1909
+ com .temp_setattr (self , "_grouper" , self .observed_grouper ),
1910
+ com .temp_setattr (self , "exclusions" , self .observed_exclusions ),
1906
1911
):
1907
1912
return self ._reduction_kernel_transform (
1908
1913
func , * args , engine = engine , engine_kwargs = engine_kwargs , ** kwargs
1909
1914
)
1910
1915
1911
- # with com.temp_setattr(self, "as_index", True):
1912
- # # GH#49834 - result needs groups in the index for
1913
- # # _wrap_transform_fast_result
1914
- # if func in ["idxmin", "idxmax"]:
1915
- # func = cast(Literal["idxmin", "idxmax"], func)
1916
- # result = self._idxmax_idxmin(func, True, *args, **kwargs)
1917
- # else:
1918
- # if engine is not None:
1919
- # kwargs["engine"] = engine
1920
- # kwargs["engine_kwargs"] = engine_kwargs
1921
- # result = getattr(self, func)(*args, **kwargs)
1922
-
1923
- # print("result with observed = False\n", result.to_string())
1924
- # r = self._wrap_transform_fast_result(result)
1925
- # print("reindexed result", r.to_string())
1926
- # return r
1927
-
1928
1916
@final
1929
1917
def _reduction_kernel_transform (
1930
1918
self , func , * args , engine = None , engine_kwargs = None , ** kwargs
0 commit comments