108
108
ScalarResult = TypeVar ("ScalarResult" )
109
109
110
110
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 ):
112
117
"""
113
118
Helper for column specific aggregation with control over output column names.
114
119
@@ -134,8 +139,28 @@ class NamedAgg(NamedTuple):
134
139
2 1 12.0
135
140
"""
136
141
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 )
139
164
140
165
141
166
class SeriesGroupBy (GroupBy [Series ]):
0 commit comments