如何用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。
实现方案
核心逻辑:
- 分离出无缺失值的参考行,以及需要填充缺失值的目标行
- 对每个目标行,计算其与所有参考行在非待填充列的绝对差异和
- 选取差异和最小的参考行,用该行的对应列值填充目标行的缺失值
代码实现:
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
相关产品推荐
相关产品推荐

