Pandas Groupby:如何将自定义Lambda条件函数整合到聚合操作中
我懂你的需求啦——已经能通过lambda实现按item-date分组后统计PriceDiff_pct的正负值数量,现在想把这类自定义聚合逻辑和Pandas自带的预构建聚合函数(比如mean、sum、max这类)合并到同一个分组聚合操作里,不用分开多次执行对吧?
其实Pandas的agg()方法本身就支持混合自定义lambda和内置聚合函数,而且写法非常灵活,给你两种常用的整合方式:
方式1:跨多列混合聚合(最常用)
如果需要同时对不同列执行不同的聚合操作(包括自定义和内置),可以直接用键值对+元组的形式传递给agg(),每个键就是最终结果的列名,元组的第一个元素是目标列,第二个是聚合函数(不管是lambda还是内置函数/字符串别名都可以):
# 假设你已经完成item-date分组,得到item_day_group item_day_agg = item_day_group.agg( # 自定义lambda聚合:统计PriceDiff_pct的正负数量 Pos_Count=('PriceDiff_pct', lambda val: (val > 0).sum()), Neg_Count=('PriceDiff_pct', lambda val: (val <= 0).sum()), # 内置聚合函数:统计PriceDiff_pct的均值和总和 PriceDiff_Avg=('PriceDiff_pct', 'mean'), PriceDiff_Total=('PriceDiff_pct', 'sum'), # 对其他列执行内置聚合(比如Volume列的总和和最大值) Total_Volume=('Volume', 'sum'), Max_Volume=('Volume', 'max') ).reset_index()
方式2:同一列的多聚合操作
如果只是针对某一列(比如你原来的PriceDiff_pct)同时做自定义和内置聚合,可以把多个聚合规则放在列表里,每个规则用元组(结果列名+聚合函数)表示:
item_day_agg = item_day_group['PriceDiff_pct'].agg( [ ('Pos_Count', lambda val: (val > 0).sum()), ('Neg_Count', lambda val: (val <= 0).sum()), ('Avg_Pct', 'mean'), ('Total_Pct', 'sum') ] ).reset_index()
小提示
- 内置聚合函数既可以用字符串别名(比如
'mean'、'sum'),也可以直接用对应的函数(比如np.mean、pd.Series.sum),效果完全一致; - 用这种整合方式,你只需要执行一次
agg()操作,不需要分开聚合后再用merge合并结果,代码更简洁,执行效率也更高; - 如果你的自定义逻辑比较复杂,还可以把lambda抽成单独的函数,比如:
这样代码可读性会更好,也方便复用。def count_positive(val): return (val > 0).sum() def count_negative(val): return (val <= 0).sum() item_day_agg = item_day_group.agg( Pos_Count=('PriceDiff_pct', count_positive), Neg_Count=('PriceDiff_pct', count_negative), PriceDiff_Avg=('PriceDiff_pct', 'mean') ).reset_index()
内容的提问来源于stack exchange,提问作者Z_D
相关产品推荐
相关产品推荐

