@@ -411,26 +411,33 @@ def agg_dict_like(self) -> DataFrame | Series:
411
411
else :
412
412
context_manager = nullcontext ()
413
413
414
- if isinstance ( selected_obj , ABCDataFrame ):
415
- is_non_unique_col = selected_obj . columns . duplicated (). tolist ()
416
- else :
417
- is_non_unique_col = [ False ]
414
+ is_non_unique_col = (
415
+ selected_obj . ndim == 2
416
+ and selected_obj . columns . nunique () < len ( selected_obj . columns )
417
+ )
418
418
419
419
with context_manager :
420
420
if selected_obj .ndim == 1 :
421
421
# key only used for output
422
- key_res = obj ._gotitem (selection , ndim = 1 )
423
- results = {key : key_res .agg (how ) for key , how in arg .items ()}
424
- elif any ( is_non_unique_col ) :
422
+ colg = obj ._gotitem (selection , ndim = 1 )
423
+ results = {key : colg .agg (how ) for key , how in arg .items ()}
424
+ elif is_non_unique_col :
425
425
# GH#51099
426
- # results is a dict of lists
427
- results = {}
426
+ result_data = []
427
+ result_index = []
428
428
for key , how in arg .items ():
429
- key_res = []
430
- for col_idx in selected_obj .columns .get_indexer_for ([key ]):
431
- col = selected_obj .iloc [:, col_idx ]
432
- key_res .append (col .agg (how ))
433
- results [key ] = key_res
429
+ indices = selected_obj .columns .get_indexer_for ([key ])
430
+ labels = selected_obj .columns .take (indices )
431
+ label_to_indices = defaultdict (list )
432
+ for index , label in zip (indices , labels ):
433
+ label_to_indices [label ].append (index )
434
+
435
+ for indices in label_to_indices .values ():
436
+ for indice in indices :
437
+ result_index .append (key )
438
+ result_data .append (
439
+ selected_obj ._ixs (indice , axis = 1 ).agg (how )
440
+ )
434
441
else :
435
442
# key used for column selection and output
436
443
results = {
@@ -440,7 +447,10 @@ def agg_dict_like(self) -> DataFrame | Series:
440
447
keys = list (arg .keys ())
441
448
442
449
# Avoid making two isinstance calls in all and any below
443
- is_ndframe = [isinstance (r , ABCNDFrame ) for r in results .values ()]
450
+ if is_non_unique_col :
451
+ is_ndframe = [False ]
452
+ else :
453
+ is_ndframe = [isinstance (r , ABCNDFrame ) for r in results .values ()]
444
454
445
455
# combine results
446
456
if all (is_ndframe ):
@@ -478,15 +488,8 @@ def agg_dict_like(self) -> DataFrame | Series:
478
488
else :
479
489
name = None
480
490
481
- if any (is_non_unique_col ):
482
- # Expand the scalar list and construct a series.
483
- series_list = []
484
- for key , value in results .items ():
485
- assert isinstance (value , list )
486
- series_list .append (Series (value , index = [key ] * len (value )))
487
-
488
- result = concat (series_list , axis = 0 )
489
- result .name = name
491
+ if is_non_unique_col :
492
+ result = Series (result_data , index = result_index , name = name )
490
493
else :
491
494
result = Series (results , name = name )
492
495
0 commit comments