如何在pandas DataFrame滚动均值计算中忽略NaN值?
pandas滚动均值忽略NaN值的配置方案
问题原因
pandas的rolling()方法默认要求窗口内非空值数量等于设置的窗口长度才会返回计算结果,只要窗口内存在1个NaN,最终结果就为NaN。你当前窗口长度设为5,Column3的每个长度为5的窗口中都存在NaN,因此计算结果全部为空。
解决方法
调整rolling()的min_periods参数即可,该参数指定窗口内最少需要多少个非空值就返回计算结果,你可以根据业务要求设置阈值:
方案1:全表统一规则
如果需要所有列都支持忽略NaN计算,同时保留「只有窗口凑够5行才输出结果、前4行返回NaN」的原有逻辑,可按如下代码配置:
# window=5要求窗口必须满5行才计算,min_periods=1代表窗口内只要有1个非空值就计算均值 df2 = df1.rolling(window=5, min_periods=1).mean()
如果要求窗口内非空值达到指定数量才输出结果,比如最少3个非空值才计算,把min_periods设为3即可。
方案2:仅针对Column3单独配置
如果其他列需要保持默认「窗口内全为非空才计算」的规则,仅Column3忽略空值,可单独处理该列:
df2 = df1.rolling(5).mean() # 仅对Column3调整规则 df2['Column3'] = df1['Column3'].rolling(window=5, min_periods=1).mean()
参数说明
min_periods:窗口内触发计算的最少非空值数量,默认值等于窗口长度,可根据需求灵活调整skipna:mean()方法的参数,默认值为True,即计算均值时自动忽略NaN,无特殊需求不需要额外配置
示例运行效果
用上述方案处理你的示例数据后,第4~6行的Column3滚动均值结果为:-6.5、-4.25、-2.5,其余列的计算结果和你原有输出一致。
内容的提问来源于stack exchange,提问作者fjurt
相关产品推荐
相关产品推荐

