pandas 滚动申请允许 nan

pandas rolling apply to allow nan

我有一个很简单的Pandas系列:

xx = pd.Series([1, 2, np.nan, np.nan, 3, 4, 5])

如果我运行这样我就得到了我想要的:

>>> xx.rolling(3,1).mean()
0    1.0
1    1.5
2    1.5
3    2.0
4    3.0
5    3.5
6    4.0

但是,如果我必须使用 .apply(),我无法通过忽略 mean() 操作中的 NaNs 来使其工作:

>>> xx.rolling(3,1).apply(np.mean)
0    1.0
1    1.5
2    NaN
3    NaN
4    NaN
5    NaN
6    4.0

>>> xx.rolling(3,1).apply(lambda x : np.mean(x))
0    1.0
1    1.5
2    NaN
3    NaN
4    NaN
5    NaN
6    4.0

我应该怎么做才能同时使用 .apply() 并在第一个输出中得到结果?我的实际问题更复杂,我必须使用 .apply() 来实现,但它归结为这个问题。

您可以使用 np.nanmean()

xx.rolling(3,1).apply(lambda x : np.nanmean(x))
Out[59]: 
0    1.0
1    1.5
2    1.5
3    2.0
4    3.0
5    3.5
6    4.0
dtype: float64

如果你必须显式处理 nans,你可以这样做:

xx.rolling(3,1).apply(lambda x : np.mean(x[~np.isnan(x)]))
Out[94]: 
0    1.0
1    1.5
2    1.5
3    2.0
4    3.0
5    3.5
6    4.0
dtype: float64