@@ -409,30 +409,38 @@ def agg_dict_like(self) -> DataFrame | Series:
409
409
context_manager = com .temp_setattr (obj , "as_index" , True )
410
410
else :
411
411
context_manager = nullcontext ()
412
+
413
+ if isinstance (selected_obj , ABCDataFrame ):
414
+ is_non_unique_col = selected_obj .columns .duplicated ()
415
+ else :
416
+ is_non_unique_col = [False ]
417
+
412
418
with context_manager :
413
419
if selected_obj .ndim == 1 :
414
420
# key only used for output
415
- colg = obj ._gotitem (selection , ndim = 1 )
416
- results = {key : colg .agg (how ) for key , how in arg .items ()}
417
- else :
418
- # key used for column selection and output
421
+ key_res = obj ._gotitem (selection , ndim = 1 )
422
+ results = {key : key_res .agg (how ) for key , how in arg .items ()}
423
+ elif any (is_non_unique_col ):
424
+ # GH#51099
425
+ # results is a dict of lists
419
426
results = {}
420
427
for key , how in arg .items ():
421
- indices = [i for i , col in enumerate (obj .columns ) if col == key ]
422
- if len (indices ) == 1 : # for unique columns
423
- results [key ] = obj ._gotitem (key , ndim = 1 ).agg (how )
424
- else : # for non-unique columns
425
- col_results = [obj .iloc [:, i ].agg (how ) for i in indices ]
426
- results [key ] = col_results
427
-
428
+ key_res = []
429
+ for col_idx in selected_obj .columns .get_indexer_for ([key ]):
430
+ col = selected_obj .iloc [:, col_idx ]
431
+ key_res .append (col .agg (how ))
432
+ results [key ] = key_res
433
+ else :
434
+ # key used for column selection and output
435
+ results = {
436
+ key : obj ._gotitem (key , ndim = 1 ).agg (how ) for key , how in arg .items ()
437
+ }
428
438
# set the final keys
429
439
keys = list (arg .keys ())
430
440
431
441
# Avoid making two isinstance calls in all and any below
432
442
is_ndframe = [isinstance (r , ABCNDFrame ) for r in results .values ()]
433
443
434
- is_list = [isinstance (v , list ) for v in results .values ()]
435
-
436
444
# combine results
437
445
if all (is_ndframe ):
438
446
keys_to_use : Iterable [Hashable ]
@@ -458,26 +466,28 @@ def agg_dict_like(self) -> DataFrame | Series:
458
466
"and transformation operations "
459
467
"simultaneously"
460
468
)
461
- elif any (is_list ):
462
- # GH#51099
463
- # convert list-like values in results to Series with corresponding keys
464
- from pandas import Series
465
-
466
- values = [val for sublist in results .values () for val in sublist ]
467
- keys = [key for key , sublist in results .items () for _ in sublist ]
468
- result = Series (values , index = keys )
469
469
else :
470
470
from pandas import Series
471
471
472
- # we have a dict of scalars
472
+ # we have a dict of scalars or a list of scalars
473
473
# GH 36212 use name only if obj is a series
474
474
if obj .ndim == 1 :
475
475
obj = cast ("Series" , obj )
476
476
name = obj .name
477
477
else :
478
478
name = None
479
479
480
- result = Series (results , name = name )
480
+ if any (is_non_unique_col ):
481
+ # Expand the scalar list and construct a series.
482
+ series_list = []
483
+ for key , value in results .items ():
484
+ assert isinstance (value , list )
485
+ series_list .append (Series (value , index = [key ] * len (value )))
486
+
487
+ result = concat (series_list , axis = 0 )
488
+ result .name = name
489
+ else :
490
+ result = Series (results , name = name )
481
491
482
492
return result
483
493
0 commit comments