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

如何用上下左右单元格均值填充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。

示例输入

Col0Col1Col2Col4
100959085
95NaNNaN80
90NaNNaN75
85NaNNaN70
80NaNNaN65
75706560

预期输出

Col0Col1Col2Col4
100959085
95908580
90858075
85807570
80757065
75706560

报错代码及问题

尝试代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:45:01