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

Python Pandas:不同列名主键匹配两DataFrame填充列值

Pandas 按不同列名主键匹配为DataFrame新增列

你可以根据实际使用场景选择以下两种可直接运行的方案,均能保证按主键值准确匹配,不会出现按行错位的问题:

方案1:map映射法(仅新增单列时首选,性能更高)

适合只需要从DF2取1列数据的场景,先把DF2的关联键和目标值转成字典映射,再按DF1的主键取值匹配填充:

# 构造「关联键:目标值」的映射字典
sku_total_map = DF2.set_index('AH SKU')['Total'].to_dict()
# 为DF1新增Total列,按SKU值自动匹配对应取值
DF1['Total'] = DF1['SKU'].map(sku_total_map)

运行后DF1的输出结果:

SKU  X  Y  Z  Total
0  1234  0  0  0     10
1  5642  0  0  0      2

方案2:merge关联合并法(需新增多列时首选)

适合需要同时从DF2取多列数据的场景,通过指定左右表不同的关联键做左连接,保留DF1的全部原有数据:

# 先筛选DF2需要用到的字段,避免合并时带入多余列
df2_need = DF2[['AH SKU', 'Total']]
# 左连接匹配,指定左右表各自的关联键
DF1 = DF1.merge(
    df2_need,
    left_on='SKU',
    right_on='AH SKU',
    how='left'
).drop(columns=['AH SKU']) # 删除合并后冗余的右表关联键列

该方案运行结果和方案1完全一致,后续如果需要取DF2的其他字段,只要在df2_need的列筛选列表里添加对应列名即可,无需修改其他逻辑。

注意事项

  • 禁止直接使用DF1['Total'] = DF2['Total']的方式赋值:这种写法是按行位置对齐填充,不是按主键匹配,一旦两个表行顺序不一致、行数不相同,就会出现匹配错误。
  • 匹配后如果Total列出现NaN空值,优先检查两个表关联键的数据类型是否一致:比如一个是字符串类型的'1234'、一个是整数类型的1234会判定为不匹配,可通过DF1['SKU'].dtype、DF2['AH SKU'].dtype查看字段类型,类型不一致时先做统一转换再匹配。
  • 如果DF2中存在重复的AH SKU值,方案1的map方法默认会保留最后一个重复键对应的Total值,使用前请先确认DF2的关联键取值唯一,避免取值不符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:06:57