如何使用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
相关产品推荐
相关产品推荐

