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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:06:04