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

用其他同结构DataFrame对应值均值替换DataFrame中的NaN值

用多DataFrame对应位置均值填充NaN值

嘿,这个需求很常见也很实用!我们可以借助pandas的concat和groupby组合操作,高效实现用其他DataFrame对应位置的非NaN值均值来替换NaN,具体步骤和代码如下:

步骤1:准备示例数据

首先我们还原你给出的三个DataFrame:

import pandas as pd
import numpy as np

# 创建示例DataFrame
df1 = pd.DataFrame({
    'M1': [1, 8, 4, 9],
    'M2': [1, np.nan, 2, 6],
    'M3': [2, 9, 7, 3]
})

df2 = pd.DataFrame({
    'M1': [2, 1, 1, 4],
    'M2': [3, 1, 2, 6],
    'M3': [np.nan, 6, 9, 2]
})

df3 = pd.DataFrame({
    'M1': [1, 2, 1, 1],
    'M2': [4, 9, 6, np.nan],
    'M3': [2, 1, 5, 4]
})

步骤2:计算所有DataFrame对应位置的均值

我们把所有DataFrame堆叠起来,然后按原始行索引分组,计算每组(即对应位置)的非NaN值均值:

# 将所有DataFrame合并,保留原始行索引
combined_dfs = pd.concat([df1, df2, df3])
# 按原始行索引分组,计算每个位置的均值(自动忽略NaN)
mean_reference = combined_dfs.groupby(level=0).mean()

这里groupby(level=0)是按每个DataFrame的原始行索引分组,比如所有DF的第0行、第1行分别归为一组,然后计算每组内各列的均值,这样得到的mean_reference就是每个位置的参考均值。

步骤3:用均值填充每个DataFrame的NaN

最后用fillna方法,把每个DataFrame中的NaN替换成mean_reference对应位置的均值:

# 填充每个DataFrame的NaN
df1_filled = df1.fillna(mean_reference)
df2_filled = df2.fillna(mean_reference)
df3_filled = df3.fillna(mean_reference)

验证填充结果

比如填充后的df1:

M1   M2  M3
0   1  1.0   2
1   8  5.0   9
2   4  2.0   7
3   9  6.0   3

可以看到原位置1:M2的NaN被替换成了(1 + 9)/2 = 5(来自df2和df3的对应值),符合预期。

再看填充后的df2:

M1  M2   M3
0   2   3  2.0
1   1   1  6.0
2   1   2  9.0
3   4   6  2.0

原位置0:M3的NaN被替换成了(2 + 2)/2 = 2(来自df1和df3的对应值),完全符合要求。

这个方法的好处是通用且高效,不管你有多少个结构一致的DataFrame,都可以用同样的逻辑处理,不需要手动定位每个NaN的位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:19:59