如何用上下左右单元格均值填充DataFrame内部NaN值?
用邻域均值填充DataFrame内部空值
问题背景
需要填充DataFrame内部的NaN值,规则为每个空值取上下左右四个相邻单元格的平均值,对应公式:h(i,j) = (1/4)(h(i-1,j) + h(i+1,j) + h(i,j-1) + h(i,j+1))
已知DataFrame边界单元格均有数值,内部全为NaN。
示例输入
| Col0 | Col1 | Col2 | Col4 |
|---|---|---|---|
| 100 | 95 | 90 | 85 |
| 95 | NaN | NaN | 80 |
| 90 | NaN | NaN | 75 |
| 85 | NaN | NaN | 70 |
| 80 | NaN | NaN | 65 |
| 75 | 70 | 65 | 60 |
预期输出
| Col0 | Col1 | Col2 | Col4 |
|---|---|---|---|
| 100 | 95 | 90 | 85 |
| 95 | 90 | 85 | 80 |
| 90 | 85 | 80 | 75 |
| 85 | 80 | 75 | 70 |
| 80 | 75 | 70 | 65 |
| 75 | 70 | 65 | 60 |
报错代码及问题
尝试代码:
for i in df: i.fillna( (i[:, :, 1:] + i[:, :, :-1] + i[:, :-1, :] + i[:, 1:, :])/4, inplace=True )
触发错误:cannot unpack non-iterable int object
解决方案
错误原因
- 遍历
df时,i是列名字符串,不是DataFrame的行列数据,无法使用三维索引 - DataFrame是二维结构(行×列),不存在第三维索引,你的索引写法完全错误
(a) 正确编写邻域均值公式
利用Pandas的shift操作获取上下左右邻居:
- 上方单元格:
df.shift(1)(行上移一行) - 下方单元格:
df.shift(-1)(行下移一行) - 左方单元格:
df.shift(1, axis=1)(列左移一列) - 右方单元格:
df.shift(-1, axis=1)(列右移一列)
均值计算代码:
mean_neighbors = (df.shift(1) + df.shift(-1) + df.shift(1, axis=1) + df.shift(-1, axis=1)) / 4
(b) 应用公式填充空值
方法1:单次填充(适用于线性边界场景)
因为示例中边界是线性的,单次计算即可得到准确结果:
import pandas as pd import numpy as np # 构造示例DataFrame data = { 'Col0': [100, 95, 90, 85, 80, 75], 'Col1': [95, np.nan, np.nan, np.nan, np.nan, 70], 'Col2': [90, np.nan, np.nan, np.nan, np.nan, 65], 'Col4': [85, 80, 75, 70, 65, 60] } df = pd.DataFrame(data) # 计算邻域均值 mean_neighbors = (df.shift(1) + df.shift(-1) + df.shift(1, axis=1) + df.shift(-1, axis=1)) / 4 # 仅填充原DataFrame中的NaN值 df = df.where(df.notna(), mean_neighbors) print(df)
方法2:迭代填充(适用于非线性边界场景)
如果边界是非线性的,需要多次迭代直到数值收敛:
import pandas as pd import numpy as np df = pd.DataFrame(data) df_iter = df.copy() # 设置迭代次数(按需调整) max_iter = 10 for _ in range(max_iter): mean_vals = (df_iter.shift(1) + df_iter.shift(-1) + df_iter.shift(1, axis=1) + df_iter.shift(-1, axis=1)) / 4 df_iter = df_iter.where(df_iter.notna(), mean_vals) print(df_iter)
内容的提问来源于stack exchange,提问作者Ross Clark
相关产品推荐
相关产品推荐

