Skip to content

Commit 14ef7e9

Browse files
author
luke
committed
Improve preformance
1 parent 8edc0d7 commit 14ef7e9

File tree

1 file changed

+27
-24
lines changed

1 file changed

+27
-24
lines changed

pandas/core/apply.py

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -411,26 +411,33 @@ def agg_dict_like(self) -> DataFrame | Series:
411411
else:
412412
context_manager = nullcontext()
413413

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+
)
418418

419419
with context_manager:
420420
if selected_obj.ndim == 1:
421421
# 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:
425425
# GH#51099
426-
# results is a dict of lists
427-
results = {}
426+
result_data = []
427+
result_index = []
428428
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+
)
434441
else:
435442
# key used for column selection and output
436443
results = {
@@ -440,7 +447,10 @@ def agg_dict_like(self) -> DataFrame | Series:
440447
keys = list(arg.keys())
441448

442449
# 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()]
444454

445455
# combine results
446456
if all(is_ndframe):
@@ -478,15 +488,8 @@ def agg_dict_like(self) -> DataFrame | Series:
478488
else:
479489
name = None
480490

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)
490493
else:
491494
result = Series(results, name=name)
492495

0 commit comments

Comments
 (0)