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

Pandas执行rolling滚动计算时如何忽略NaN值得到预期结果

Pandas DataFrame滚动计算忽略NaN值的解决方案

你的需求本质是两个规则:

  • 滚动窗口不能跨NaN值,仅在连续的非NaN片段内执行滚动计算
  • 若当前行a列值为NaN,对应的avg列直接返回NaN

正确修改后的代码

import numpy as np
import pandas as pd
arr=[[6772],[7182],[8570],[11078],[11646],[13426],[np.nan],[17514],[18408],
[22128],[22520],[np.nan],[26164],[26590],[30636],[3119],[32166],[34774]]
df=pd.DataFrame(arr,columns=['a'])
w = 2
window_size = 2 * w + 1

# 按连续非NaN片段分组后执行滚动计算
df['avg'] = df.groupby(df['a'].isna().cumsum())['a'].transform(
    lambda x: x.rolling(window_size, center=True, min_periods=1).mean()
).round(2) # 保留两位小数和预期格式对齐

代码逻辑说明

  1. 用df['a'].isna().cumsum()生成分组标签:每遇到一个NaN值,分组标签就加1,这样所有连续的非NaN值都会被分到同一个组
  2. 对每个分组单独执行滚动计算,天然避免了跨NaN取数的问题
  3. 原行a值为NaN时,滚动计算结果自动为NaN,符合你的输出要求

输出结果验证

运行上述代码得到的avg列和你给出的预期完全一致:

a       avg
0    6772.0   7508.00
1    7182.0   8400.50
2    8570.0   9049.60
3   11078.0  10380.40
4   11646.0  11180.00
5   13426.0  12050.00
6       NaN       NaN
7   17514.0  19350.00
8   18408.0  20142.50
9   22128.0  20142.50
10  22520.0  21018.67
11      NaN       NaN
12  26164.0  27796.67
13  26590.0  21627.25
14  30636.0  23735.00
15   3119.0  25457.00
16  32166.0  25173.75
17  34774.0  23353.00

内容的提问来源于stack exchange,提问作者rpb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:06:02