Skip to content

Commit 92966d6

Browse files
author
luke
committed
BUG: Agg in non-unique col
1 parent 5c15588 commit 92966d6

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

pandas/core/apply.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -416,16 +416,23 @@ def agg_dict_like(self) -> DataFrame | Series:
416416
results = {key: colg.agg(how) for key, how in arg.items()}
417417
else:
418418
# key used for column selection and output
419-
results = {
420-
key: obj._gotitem(key, ndim=1).agg(how) for key, how in arg.items()
421-
}
419+
results = {}
420+
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
422427

423428
# set the final keys
424429
keys = list(arg.keys())
425430

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

434+
is_list = [isinstance(v, list) for v in results.values()]
435+
429436
# combine results
430437
if all(is_ndframe):
431438
keys_to_use: Iterable[Hashable]
@@ -451,6 +458,14 @@ def agg_dict_like(self) -> DataFrame | Series:
451458
"and transformation operations "
452459
"simultaneously"
453460
)
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)
454469
else:
455470
from pandas import Series
456471

pandas/tests/apply/test_frame_apply.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1642,3 +1642,15 @@ def foo2(x, b=2, c=0):
16421642
columns=MultiIndex.from_tuples([("x", "foo1"), ("x", "foo2")]),
16431643
)
16441644
tm.assert_frame_equal(result, expected)
1645+
1646+
1647+
def test_agg_dist_like_and_nonunique_columns():
1648+
# GH#51099
1649+
df = DataFrame(
1650+
{"A": [None, 2, 3], "B": [1.0, np.nan, 3.0], "C": ["foo", None, "bar"]}
1651+
)
1652+
df.columns = ["A", "A", "C"]
1653+
1654+
result = df.agg({"A": "count"}) # same with 'apply' instead of 'agg'
1655+
expected = df["A"].count()
1656+
tm.assert_series_equal(result, expected)

0 commit comments

Comments
 (0)