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
相关产品推荐
相关产品推荐

