如何在含NaN的Pandas序列中获取符合预期的滚动最大值?
Pandas滚动最大值处理NaN值不符合预期的解决方案
问题说明
当Pandas序列包含NaN值时,使用rolling(window).max()无法得到预期结果:默认行为会因窗口内存在NaN直接返回NaN,而非忽略NaN取窗口内的有效最大值;同时max(skipna=True)参数已被弃用,无法生效。需要实现的逻辑是:
- 窗口内存在至少一个非NaN值时,返回该窗口的最大值(忽略NaN)
- 窗口内全为NaN时,返回NaN
解决方案
使用rolling.apply()自定义处理逻辑,结合Series的最大值方法实现需求,同时保留全NaN窗口的NaN结果。
完整代码示例
import pandas as pd import numpy as np # 场景1数据 x1 = pd.Series([1,2,np.nan,4,np.nan]) # 场景2数据 x2 = pd.Series([1,2,np.nan,np.nan,4,np.nan]) # 定义滚动最大值处理函数 def rolling_max_with_nan(window): # 检查窗口内是否有非NaN值 if window.notna().any(): return window.max(skipna=True) else: return np.nan # 处理场景1 out1 = x1.rolling(window=2).apply(rolling_max_with_nan, raw=False) print("场景1输出:") print(out1) print() # 处理场景2 out2 = x2.rolling(window=2).apply(rolling_max_with_nan, raw=False) print("场景2输出:") print(out2)
输出结果
场景1输出:
0 NaN 1 2.0 2 2.0 3 4.0 4 4.0 dtype: float64
场景2输出:
0 NaN 1 2.0 2 2.0 3 NaN 4 4.0 5 4.0 dtype: float64
代码说明
raw=False:确保传入自定义函数的是Pandas Series对象,而非numpy数组,方便用notna().any()判断窗口内是否有有效值- 自定义函数先检查窗口内是否存在非NaN值:有则返回忽略NaN的最大值,无则返回NaN,完全匹配预期逻辑
内容的提问来源于stack exchange,提问作者Nilesh Ingle
相关产品推荐
相关产品推荐

