Pandas执行rolling滚动计算时如何忽略NaN值得到预期结果
Pandas DataFrame滚动计算忽略NaN值的解决方案
你的需求本质是两个规则:
- 滚动窗口不能跨NaN值,仅在连续的非NaN片段内执行滚动计算
- 若当前行a列值为NaN,对应的avg列直接返回NaN
正确修改后的代码
import numpy as np import pandas as pd arr=[[6772],[7182],[8570],[11078],[11646],[13426],[np.nan],[17514],[18408], [22128],[22520],[np.nan],[26164],[26590],[30636],[3119],[32166],[34774]] df=pd.DataFrame(arr,columns=['a']) w = 2 window_size = 2 * w + 1 # 按连续非NaN片段分组后执行滚动计算 df['avg'] = df.groupby(df['a'].isna().cumsum())['a'].transform( lambda x: x.rolling(window_size, center=True, min_periods=1).mean() ).round(2) # 保留两位小数和预期格式对齐
代码逻辑说明
- 用
df['a'].isna().cumsum()生成分组标签:每遇到一个NaN值,分组标签就加1,这样所有连续的非NaN值都会被分到同一个组 - 对每个分组单独执行滚动计算,天然避免了跨NaN取数的问题
- 原行a值为NaN时,滚动计算结果自动为NaN,符合你的输出要求
输出结果验证
运行上述代码得到的avg列和你给出的预期完全一致:
a avg 0 6772.0 7508.00 1 7182.0 8400.50 2 8570.0 9049.60 3 11078.0 10380.40 4 11646.0 11180.00 5 13426.0 12050.00 6 NaN NaN 7 17514.0 19350.00 8 18408.0 20142.50 9 22128.0 20142.50 10 22520.0 21018.67 11 NaN NaN 12 26164.0 27796.67 13 26590.0 21627.25 14 30636.0 23735.00 15 3119.0 25457.00 16 32166.0 25173.75 17 34774.0 23353.00
内容的提问来源于stack exchange,提问作者rpb
相关产品推荐
相关产品推荐

