Pandas分组滚动求和结果赋值后全为NaN的问题求助
解决Pandas Rolling分组求和后赋值出现NaN的问题
问题根源
出现全NaN的核心原因是索引对齐失败:
groupby('user_id')['v1'].rolling('3D').sum()返回的结果带有多层索引(user_id+create_at)- 你执行
reset_index(drop=True)后,结果变成了默认整数索引,和原数据d1的create_at索引完全不匹配,Pandas按索引匹配赋值时找不到对应项,因此全为NaN。
两种可行解决方法
方法1:直接提取结果值赋值
分组Rolling计算后的结果顺序和原数据行顺序完全一致,直接提取值数组即可完成赋值:
# 计算分组滚动求和 roll_sum = d1.groupby('user_id')['v1'].rolling('3D').sum() # 提取值数组赋值给新列 d1['roll_3D'] = roll_sum.values
方法2:使用transform方法(推荐)
transform方法会自动将分组计算的结果对齐回原数据的索引,无需手动处理索引逻辑:
d1['roll_3D'] = d1.groupby('user_id')['v1'].transform(lambda x: x.rolling('3D').sum())
验证结果
用你的测试数据执行上述方法后,会得到正确的赋值结果:
| create_at | user_id | v1 | roll_3D |
|---|---|---|---|
| 2022-05-31 21:00:21.150822 | 15991247 | 0.028059 | 0.028059 |
| 2022-05-31 21:00:33.620000 | 24062521 | 1.781399 | 1.781399 |
| 2022-05-31 21:01:30.349000 | 12610025 | 0.952400 | 0.952400 |
| 2022-05-31 21:02:38.836000 | 24062521 | 1.571899 | 3.353298 |
| 2022-05-31 21:02:44.156000 | 24062521 | 0.952600 | 4.305898 |
内容的提问来源于stack exchange,提问作者Beck
相关产品推荐
相关产品推荐

