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

如何使用Pandas将NaN替换为最近5个值的平均值?

如何用最近5个值的平均值迭代替换数据集中的NaN

你提到的df.fillna(df.mean())是用全局均值填充所有NaN,完全无法满足"用最近5个值(包括已填充的NaN)的平均值迭代替换"的需求,下面是针对性的解决方案:

核心思路

因为后续NaN的填充依赖前面已替换完成的值,所以必须按顺序逐个处理每个NaN,计算其指定范围内的5个值的平均值来替换。

1. 构造示例数据

import pandas as pd
import numpy as np

# 匹配你描述的示例数据集
data = {'values': [1, 2, 3, 4, 5, np.nan, 6, np.nan, 7, 8]}
df = pd.DataFrame(data)

2. 迭代填充实现

方案A:取当前NaN位置最近的前5个值(含已填充值)

# 获取所有NaN的索引,按顺序处理
nan_indices = df[df['values'].isna()].index

for idx in nan_indices:
    # 选取当前位置前5个值(自动适配不足5个的情况)
    window = df['values'].iloc[idx-5:idx]
    # 计算窗口平均值并替换NaN
    df.loc[idx, 'values'] = window.mean()

处理后结果:

values
1.0
2.0
3.0
4.0
5.0
3.0
6.0
4.2
7.0
8.0

方案B:严格匹配你示例的逻辑(取[2,3,4,5,第一个NaN填充值])

如果需要第二个NaN的计算范围是当前位置前第5到前第1个值,调整窗口选取范围即可:

for idx in nan_indices:
    # 选取当前位置前第5个到前第1个值(共5个)
    window = df['values'].iloc[idx-6:idx-1]
    df.loc[idx, 'values'] = window.mean()

此时第二个NaN的填充值为(2+3+4+5+3)/5 = 3.4,完全符合你给出的示例要求。

为什么df.fillna(df.mean())不适用?

这个方法是计算整列的全局平均值,用单一值替换所有NaN,既没有考虑"最近5个值"的范围限制,也不支持迭代填充的依赖逻辑,因此无法满足你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:20:29