You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 06:30:05