pandas.rolling.apply(raw参数不同时,np.prod处理NaN的行为差异疑问
pandas.rolling.apply结合np.prod处理NaN的行为差异解释
核心原因:raw参数决定传递给np.prod的数据类型
- 当设置
raw=False时,滚动窗口会将数据以pandas Series对象传递给np.prod。pandas的Series在计算乘积时默认启用skipna=True,即便调用的是np.prod,底层也会沿用Series的乘积逻辑,自动忽略NaN值。 - 当设置
raw=True时,滚动窗口会将数据以numpy数组传递给np.prod。numpy原生的prod函数没有跳过NaN的默认逻辑,只要数组中存在NaN,最终乘积结果就会直接返回NaN。
场景验证
以2013-01-04的B列滚动窗口为例:
- 窗口内的数据为
[1.0, 2.0, np.nan] raw=False时,传递的是Series,np.prod(Series)等价于Series.prod(skipna=True),计算结果为1.0*2.0=2.0raw=True时,传递的是numpy数组np.array([1.0,2.0,np.nan]),np.prod直接返回NaN
解决办法:用np.nanprod替代np.prod
如果要保留raw=True的性能优势,同时实现忽略NaN的乘积计算,只需使用numpy专门的忽略NaN乘积函数np.nanprod:
df.rolling('3D', min_periods=1).apply(np.nanprod, raw=True)
执行后结果与raw=False时完全一致:
B C 2013-01-01 1.0 1.0 2013-01-02 1.0 2.0 2013-01-03 2.0 6.0 2013-01-04 2.0 24.0 2013-01-05 8.0 60.0
内容的提问来源于stack exchange,提问作者Jetpac
相关产品推荐
相关产品推荐

