首页 > 解决方案 > b.sum() 产生 0 而 b.rolling(2).sum() 产生 nan,其中 b=pd.Series([np.nan, np.nan])

问题描述

pandas.sum()默认情况下会跳过 NaN,因此我希望b.rolling(2).sum()也将 NaN 替换为 0。但是,b.rolling(2).sum()产生 NaN 而不是 0,其中b = pd.Series([np.nan, np.nan]).

标签: pythonpandasnumpy

解决方案


DataFrame.rolling方法带有一个参数min_periods,默认为窗口的大小。在积累了许多非缺失值之前,滚动计算将留下缺失值。您的所有值都丢失了,因此计算永远不会累积 2 个值。

对于这种全 NaN 情况,您只需将参数设置为 0。

pd.Series([np.NaN, np.NaN]).rolling(2, min_periods=0).sum()                                                                                                                                                                         
# 0    0.0
# 1    0.0

但这也会改变存在前两个值的系列的行为。它将保留第一个值,而不是空的表示滚动总和中还没有 2 个值。

pd.Series([1, 2]).rolling(2).sum()                                                                                                                                                                                                  
# 0    NaN
# 1    3.0

pd.Series([1, 2]).rolling(2, min_periods=0).sum()                                                                                                                                                                                   
# 0    1.0
# 1    3.0

为避免这种情况,我需要更多地了解您的用例。


推荐阅读