Skip to content

Commit 9c21e63

Browse files
author
luke
committed
Fix bug but add more codes
1 parent 7fcee94 commit 9c21e63

File tree

2 files changed

+34
-24
lines changed

2 files changed

+34
-24
lines changed

pandas/core/apply.py

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -409,30 +409,38 @@ def agg_dict_like(self) -> DataFrame | Series:
409409
context_manager = com.temp_setattr(obj, "as_index", True)
410410
else:
411411
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+
412418
with context_manager:
413419
if selected_obj.ndim == 1:
414420
# 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
419426
results = {}
420427
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+
}
428438
# set the final keys
429439
keys = list(arg.keys())
430440

431441
# Avoid making two isinstance calls in all and any below
432442
is_ndframe = [isinstance(r, ABCNDFrame) for r in results.values()]
433443

434-
is_list = [isinstance(v, list) for v in results.values()]
435-
436444
# combine results
437445
if all(is_ndframe):
438446
keys_to_use: Iterable[Hashable]
@@ -458,26 +466,28 @@ def agg_dict_like(self) -> DataFrame | Series:
458466
"and transformation operations "
459467
"simultaneously"
460468
)
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)
469469
else:
470470
from pandas import Series
471471

472-
# we have a dict of scalars
472+
# we have a dict of scalars or a list of scalars
473473
# GH 36212 use name only if obj is a series
474474
if obj.ndim == 1:
475475
obj = cast("Series", obj)
476476
name = obj.name
477477
else:
478478
name = None
479479

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)
481491

482492
return result
483493

pandas/tests/apply/test_frame_apply.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1674,6 +1674,6 @@ def test_agg_dist_like_and_nonunique_columns():
16741674
)
16751675
df.columns = ["A", "A", "C"]
16761676

1677-
result = df.agg({"A": "count"}) # same with 'apply' instead of 'agg'
1677+
result = df.agg({"A": "count"})
16781678
expected = df["A"].count()
16791679
tm.assert_series_equal(result, expected)

0 commit comments

Comments
 (0)