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

Pandas将groupby rolling均值结果赋值到原DataFrame新列的方法

报错原因

触发ValueError: cannot reindex from a duplicate axis的核心原因有两个:

  1. 你写的赋值代码存在语法笔误:groupby('customer'位置漏写了右括号
  2. 原DataFrame的date_time索引存在重复值(同一时间戳对应多个不同客户的行),你用reset_index(level=0, drop=True)处理后,结果仅保留带重复值的时间索引,pandas无法通过重复索引完成和原表的精准行对齐,就会抛出重复轴错误。
正确实现方案

不需要手动处理多层索引对齐,以下两种方法都可以在保留原表date_time索引的前提下,把分组滚动均值正确添加为新列:

  • 方法1:使用groupby.transform实现,计算结果自动和原表行顺序严格对齐,是最稳妥的写法,不会出现索引错位问题:
df['ma_24h'] = df.groupby('customer')['avg_price'].transform(
    lambda col: col.rolling(50).mean()
)
  • 方法2:如果要沿用你已经写好的rolling计算逻辑,直接取计算结果的底层numpy数组赋值,绕开索引对齐步骤,只要groupby和rolling过程没有打乱原始行顺序就可以正常运行:
# 修正原代码的括号笔误后,直接取values赋值
df['ma_24h'] = df.groupby('customer')['avg_price'].rolling(50).mean().values

避坑提示:不要用带重复时间索引的序列直接给原表赋值,一旦序列的行顺序和原表不一致,就会出现数据错位,且很难排查。

内容的提问来源于stack exchange,提问作者Geosphere

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:06:28