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

如何用Python实现以最小差异和填充DataFrame缺失值?

问题描述

给定如下DataFrame:

import pandas as pd
import numpy as np

# 创建示例DataFrame
df = pd.DataFrame({'Age': [np.nan, 31, 29, 43, np.nan],
                   'Weight': [np.nan, 100, 60, 75, np.nan],
                   'Height': [1.65, 1.64, 1.75, 1.70, 1.68],
                   'BMI': [19, 15, 10, 25, 30]})

需要填充缺失值的列:

case_columns = ['Age', 'Weight']

需求:将缺失值替换为与该行差异和最小的行的对应列值。差异和指该行与其他非缺失行在非待填充列(Height、BMI)的数值差的绝对值之和。例如行0的Age取31、Weight取100,因为它和行1的差异和|1.65-1.64| + |19-15|最小;行4的Age取43、Weight取75。

实现方案

核心逻辑:

  1. 分离出无缺失值的参考行,以及需要填充缺失值的目标行
  2. 对每个目标行,计算其与所有参考行在非待填充列的绝对差异和
  3. 选取差异和最小的参考行,用该行的对应列值填充目标行的缺失值

代码实现:

import pandas as pd
import numpy as np

# 初始化数据
df = pd.DataFrame({'Age': [np.nan, 31, 29, 43, np.nan],
                   'Weight': [np.nan, 100, 60, 75, np.nan],
                   'Height': [1.65, 1.64, 1.75, 1.70, 1.68],
                   'BMI': [19, 15, 10, 25, 30]})
case_columns = ['Age', 'Weight']

# 筛选参考行(无缺失值的行)和目标行索引
reference_rows = df.dropna(subset=case_columns).copy()
target_idx = df[df[case_columns].isna().any(axis=1)].index

# 自动识别非待填充列
non_case_cols = [col for col in df.columns if col not in case_columns]

# 遍历填充每个目标行
for idx in target_idx:
    current_data = df.loc[idx, non_case_cols]
    # 计算与所有参考行的绝对差异和
    diff_sum = reference_rows[non_case_cols].sub(current_data).abs().sum(axis=1)
    # 找到差异最小的参考行
    closest_row = diff_sum.idxmin()
    # 填充缺失值
    df.loc[idx, case_columns] = reference_rows.loc[closest_row, case_columns]

print(df)

运行结果:

Age  Weight  Height  BMI
0  31.0   100.0    1.65   19
1  31.0   100.0    1.64   15
2  29.0    60.0    1.75   10
3  43.0    75.0    1.70   25
4  43.0    75.0    1.68   30

代码说明

  • reference_rows:提取Age和Weight均无缺失的行,作为填充的数据源
  • target_idx:定位所有需要填充缺失值的行索引
  • non_case_cols:自动排除待填充列,避免硬编码列名,提升代码通用性
  • 循环过程中通过计算绝对差异和,精准匹配最相似的参考行完成填充

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:45:15