Pandas Groupby多自定义函数聚合时报[('price', '<lambda>')] not in index错误
问题原因
这是pandas 0.25.x版本的已知问题:该版本刚推出基于命名元组的agg聚合语法,对重复使用同一个匿名lambda函数处理不同列的场景存在识别bug,函数默认的__name__属性都是<lambda>,导致聚合后的MultiIndex出现重复键冲突,触发not in index报错。
解决方法
方法1:修改自定义函数的名称属性,避免键冲突
给两个用到的加权平均函数设置不同的名称标识,解决重复键问题:
import numpy as np import pandas as pd # 分别定义两个加权平均函数,设置不同的名称 wm_travel = lambda x: np.average(x, weights=res_df.loc[x.index, "trips"]) wm_travel.__name__ = "wm_travel" wm_price = lambda x: np.average(x, weights=res_df.loc[x.index, "trips"]) wm_price.__name__ = "wm_price" # 执行聚合 grp = res_df.groupby('price_per_time').agg( tot_trips=('trips', 'sum'), tot_price=('price', 'sum'), sw=('sw', 'sum'), mean_travel_time=('travel_time', wm_travel), mean_price=('price', wm_price) ).reset_index()
方法2:改用字典格式的聚合参数,绕开命名聚合的兼容问题
0.25版本对字典传参的聚合逻辑完全兼容,聚合后手动重命名列即可:
grp = res_df.groupby('price_per_time').agg({ "trips": "sum", "price": ["sum", wm], "sw": "sum", "travel_time": wm }).reset_index() # 重命名多层列 grp.columns = [ "price_per_time", "tot_trips", "tot_price", "mean_price", "sw", "mean_travel_time" ]
方法3(更推荐):使用groupby.apply处理全分组逻辑
直接把每个分组的完整DataFrame传入自定义函数计算,不需要依赖全局的res_df索引匹配,稳定性更高:
def group_agg(group): return pd.Series({ "tot_trips": group["trips"].sum(), "tot_price": group["price"].sum(), "sw": group["sw"].sum(), "mean_travel_time": np.average(group["travel_time"], weights=group["trips"]), "mean_price": np.average(group["price"], weights=group["trips"]) }) grp = res_df.groupby('price_per_time').apply(group_agg).reset_index()
内容的提问来源于stack exchange,提问作者ron zuk
相关产品推荐
相关产品推荐

