You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:41:18