@@ -524,7 +524,8 @@ def _aggregate_named(self, func, *args, **kwargs):
524
524
for name , group in self :
525
525
# Each step of this loop corresponds to
526
526
# libreduction._BaseGrouper._apply_to_group
527
- group .name = name # NB: libreduction does not pin name
527
+ # NB: libreduction does not pin name
528
+ object .__setattr__ (group , "name" , name )
528
529
529
530
output = func (group , * args , ** kwargs )
530
531
output = libreduction .extract_result (output )
@@ -567,9 +568,9 @@ def transform(self, func, *args, engine=None, engine_kwargs=None, **kwargs):
567
568
# Temporarily set observed for dealing with categoricals.
568
569
with com .temp_setattr (self , "observed" , True ):
569
570
result = getattr (self , func )(* args , ** kwargs )
570
- return self ._transform_fast (result )
571
+ return self ._wrap_transform_fast_result (result )
571
572
572
- def _transform_general (self , func , * args , ** kwargs ):
573
+ def _transform_general (self , func : Callable , * args , ** kwargs ) -> Series :
573
574
"""
574
575
Transform with a callable func`.
575
576
"""
@@ -599,7 +600,7 @@ def _transform_general(self, func, *args, **kwargs):
599
600
result .name = self ._selected_obj .name
600
601
return result
601
602
602
- def _transform_fast (self , result ) -> Series :
603
+ def _wrap_transform_fast_result (self , result : Series ) -> Series :
603
604
"""
604
605
fast version of transform, only applicable to
605
606
builtin/cythonizable functions
@@ -1436,11 +1437,11 @@ def transform(self, func, *args, engine=None, engine_kwargs=None, **kwargs):
1436
1437
if isinstance (result , DataFrame ) and result .columns .equals (
1437
1438
self ._obj_with_exclusions .columns
1438
1439
):
1439
- return self ._transform_fast (result )
1440
+ return self ._wrap_transform_fast_result (result )
1440
1441
1441
1442
return self ._transform_general (func , * args , ** kwargs )
1442
1443
1443
- def _transform_fast (self , result : DataFrame ) -> DataFrame :
1444
+ def _wrap_transform_fast_result (self , result : DataFrame ) -> DataFrame :
1444
1445
"""
1445
1446
Fast transform path for aggregations
1446
1447
"""
@@ -1449,14 +1450,9 @@ def _transform_fast(self, result: DataFrame) -> DataFrame:
1449
1450
# for each col, reshape to size of original frame by take operation
1450
1451
ids , _ , _ = self .grouper .group_info
1451
1452
result = result .reindex (self .grouper .result_index , copy = False )
1452
- output = [
1453
- algorithms .take_nd (result .iloc [:, i ].values , ids )
1454
- for i , _ in enumerate (result .columns )
1455
- ]
1456
-
1457
- return self .obj ._constructor ._from_arrays (
1458
- output , columns = result .columns , index = obj .index
1459
- )
1453
+ output = result .take (ids , axis = 0 )
1454
+ output .index = obj .index
1455
+ return output
1460
1456
1461
1457
def _define_paths (self , func , * args , ** kwargs ):
1462
1458
if isinstance (func , str ):
@@ -1653,7 +1649,7 @@ def _gotitem(self, key, ndim: int, subset=None):
1653
1649
1654
1650
raise AssertionError ("invalid ndim for _gotitem" )
1655
1651
1656
- def _wrap_frame_output (self , result , obj : DataFrame ) -> DataFrame :
1652
+ def _wrap_frame_output (self , result : dict , obj : DataFrame ) -> DataFrame :
1657
1653
result_index = self .grouper .levels [0 ]
1658
1654
1659
1655
if self .axis == 0 :
0 commit comments