用其他同结构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
相关产品推荐
相关产品推荐

