如何用Pandas从另一数据集填充多列缺失值(NA)
高效填充DataFrame中匹配行的缺失值
方案一:利用set_index + combine_first(推荐,高效简洁)
这个方法完美适配50+列的批量处理场景,无需手动指定列名:
- 将两个DataFrame按匹配键
col1和col2设置为索引 - 自动提取所有以
z_开头的列 - 用
combine_first方法,批量用df2的对应列填充df1的缺失值 - 最后恢复原索引结构
代码示例:
import pandas as pd import numpy as np df1 = pd.DataFrame(data= {'col1': [1, 2], 'col2': ["A", "B"], 'z_col3': [3, np.nan], 'z_col4': [3, 4]} ) df2 = pd.DataFrame(data= {'col1': [1,2], 'col2': ["C", "B"], 'z_col3': [3, 4], 'z_col4': [3, 4]} ) # 自动筛选z_开头的列 z_cols = [col for col in df1.columns if col.startswith('z_')] # 执行填充操作 df1_filled = (df1.set_index(['col1', 'col2']) .combine_first(df2.set_index(['col1', 'col2'])[z_cols]) .reset_index()) print(df1_filled)
输出结果:
col1 col2 z_col3 z_col4 0 1 A 3.0 3.0 1 2 B 4.0 4.0
原代码报错原因
你之前使用的map是Series级别的操作,无法直接处理多列DataFrame或多层索引结构,因此会触发类型不匹配的错误。上面的方案采用pandas原生向量化操作,性能远高于循环,适合大列数场景。
方案二:合并后逐列填充(逻辑直观,适合需保留中间步骤的场景)
如果需要先合并表再处理,可采用merge配合fillna:
# 左连接合并,保留df1所有行 merged = df1.merge(df2, on=['col1', 'col2'], how='left', suffixes=('', '_df2')) # 批量填充每个z_列的缺失值 for col in z_cols: merged[col] = merged[col].fillna(merged[f'{col}_df2']) # 清理多余的df2衍生列 df1_filled = merged.drop([f'{col}_df2' for col in z_cols], axis=1)
该方法逻辑易懂,但合并操作会生成额外列,性能略逊于方案一。
内容的提问来源于stack exchange,提问作者User981636
相关产品推荐
相关产品推荐

