Python Pandas Numpy基于公共ID用另一DataFrame替换横杠(NA)值
实现两个DataFrame按ID匹配补全缺失值的方法
以下为Python pandas环境下的实现方案,假设存在两个DataFrame:df1(含-标识的缺失值,需要补全)、df2(作为补全的数据源),二者共有ID列作为匹配主键,数据结构参考下图:
步骤1:预处理缺失值
首先将df1中的横杠统一转换为pandas可识别的标准缺失值:
import pandas as pd df1 = df1.replace('-', pd.NA)
步骤2:两种补全方案选其一即可
方案1:用combine_first快速补全(推荐)
该方法会自动保留df1的现有非空值,仅用df2的对应值填充空值,操作最简洁:
# 两个表均设置ID为索引,用于匹配 df1_idx = df1.set_index('ID') df2_idx = df2.set_index('ID') # 若仅需补全指定列,可先从df2中筛选需要的列,示例为只保留value列用于补全: # df2_idx = df2.set_index('ID')[['value']] # 合并补全后恢复ID为普通列 df_result = df1_idx.combine_first(df2_idx).reset_index()
方案2:用merge自定义补全逻辑
适合需要灵活控制补全规则、仅补全部分列的场景:
# 按ID左连接两个表,参考列后缀加_ref避免重名 df_merge = df1.merge(df2, on='ID', how='left', suffixes=('', '_ref')) # 填入需要补全的列名列表 fill_columns = ['col1', 'col2', 'col3'] for col in fill_columns: # 原列非空时保留原值,为空时用参考列的值填充 df_merge[col] = df_merge[col].where(df_merge[col].notna(), df_merge[f'{col}_ref']) # 删除生成的参考列,得到最终结果 df_result = df_merge.drop(columns=[c for c in df_merge.columns if c.endswith('_ref')])
注意事项
- 提前确认两个表的ID列数据类型完全一致,比如ID为字符串类型时不要出现一个存数字、一个存文本的情况,会导致匹配失败
- 若
df2存在重复ID的行,建议先执行df2 = df2.drop_duplicates('ID')去重,避免匹配产生多余行 - 不需要补全的列不要加入补全逻辑,避免意外覆盖
df1的原有数据
内容的提问来源于stack exchange,提问作者m hammad
相关产品推荐
相关产品推荐

