我有一个非常简单的熊猫系列:
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()
我无法通过忽略NaN
操作中的mean()
来使其工作:
>>> 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()
来实现,但归结为这个问题。
答案 0 :(得分:2)
您可以使用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