Skip to content

Commit 14d4973

Browse files
committed
Named agg allow kwargs
1 parent b162331 commit 14d4973

File tree

1 file changed

+28
-3
lines changed

1 file changed

+28
-3
lines changed

pandas/core/groupby/generic.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,12 @@
108108
ScalarResult = TypeVar("ScalarResult")
109109

110110

111-
class NamedAgg(NamedTuple):
111+
class _BaseNamedAgg(NamedTuple):
112+
column: Hashable
113+
aggfunc: AggScalar
114+
115+
116+
def NamedAgg(column: Hashable, aggfunc: AggScalar, *args, **kwargs):
112117
"""
113118
Helper for column specific aggregation with control over output column names.
114119
@@ -134,8 +139,28 @@ class NamedAgg(NamedTuple):
134139
2 1 12.0
135140
"""
136141

137-
column: Hashable
138-
aggfunc: AggScalar
142+
class NamedAggWrapper(_BaseNamedAgg):
143+
def __new__(cls, _column, _aggfunc, *_args, **_kwargs):
144+
original_aggfunc = _aggfunc
145+
if not isinstance(_aggfunc, str):
146+
_aggfunc = cls._get_wrapped_aggfunc(_aggfunc, *_args, **_kwargs)
147+
148+
self = _BaseNamedAgg.__new__(_column, _aggfunc)
149+
self.original_aggfunc = original_aggfunc
150+
return self
151+
152+
@staticmethod
153+
def _get_wrapped_aggfunc(function, *initial_args, **initial_kwargs):
154+
def wrapped_aggfunc(*new_args, **new_kwargs):
155+
final_args = new_args + initial_args
156+
final_kwargs = {**initial_kwargs, **new_kwargs}
157+
return function(*final_args, **final_kwargs)
158+
return wrapped_aggfunc
159+
160+
def __repr__(self):
161+
return f"NamedAgg(column='{self.column}', aggfunc={self.original_aggfunc})"
162+
163+
return NamedAggWrapper(column, aggfunc, *args, **kwargs)
139164

140165

141166
class SeriesGroupBy(GroupBy[Series]):

0 commit comments

Comments
 (0)