Pandas将groupby rolling均值结果赋值到原DataFrame新列的方法
报错原因
触发ValueError: cannot reindex from a duplicate axis的核心原因有两个:
- 你写的赋值代码存在语法笔误:
groupby('customer'位置漏写了右括号 - 原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
相关产品推荐
相关产品推荐

