在Pandas的groupby中使用pd.NamedAgg调用shift函数报错求助
问题原因
shift不属于聚合函数——它不会将分组后的一组数据压缩为单个值,而是返回与原分组行数一致的序列。而mean、max这类聚合函数返回的是每组单个值,两者输出结构不兼容,导致索引合并时触发NotImplementedError。
解决方法
方法一:拆分处理后合并
先计算常规聚合项,再单独处理移位逻辑,最后合并结果:
# 计算基础聚合结果 agg_result = df.groupby(["ID", "Day", "hour"]).agg( profit_avg=pd.NamedAgg(column='profit', aggfunc='mean'), volume_max=pd.NamedAgg(column='volume', aggfunc='max') ) # 计算组内移位后的price,再聚合为每组单个值(示例取每组第一个值,可按需调整为last等) price_shift = df.groupby(["ID", "Day", "hour"])['price'].shift().groupby(["ID", "Day", "hour"]).first() # 合并两个结果 final_result = agg_result.join(price_shift.rename('pn_price_shift'))
方法二:先生成移位列再聚合
用transform将组内移位结果广播回原DataFrame,再统一聚合:
# 在原数据中添加组内移位后的price列 df['pn_price_shift'] = df.groupby(["ID", "Day", "hour"])['price'].shift() # 统一聚合,移位列按需取单个值(示例取first) final_result = df.groupby(["ID", "Day", "hour"]).agg( profit_avg=pd.NamedAgg(column='profit', aggfunc='mean'), volume_max=pd.NamedAgg(column='volume', aggfunc='max'), pn_price_shift=pd.NamedAgg(column='pn_price_shift', aggfunc='first') )
注意事项
移位后的每组会有多个值(与组内行数一致),需根据业务需求选择聚合逻辑:比如first取移位后的第一个值、last取最后一个值,或其他自定义逻辑。如果组内移位后存在NaN,要提前处理或选择合适的聚合方式。
内容的提问来源于stack exchange,提问作者deltascience
相关产品推荐
相关产品推荐

