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

pandas如何根据参考表匹配填充DataFrame指定列值

问题根源

你之前的merge写法没指定关联字段,pandas默认会把两个表所有列名相同的字段都作为匹配依据。你现在两个表都有MANUF/PRODTYPE/PRODCODE三个同名列,而待填充的df里PRODCODE本身是空值,自然匹配不上,结果要么缺数据要么值不对。
另外你写df2.merge(df, how='left')的时候主表是只有400行的参考表df2,左连接会保留df2的所有行,df里匹配不上的行会直接被丢掉,结果肯定不符合预期。

可用解决方案

方案1:指定关联键的左连接(逻辑直观,适合大多数场景)

明确告诉pandas只按MANUF和PRODTYPE两个字段做匹配,处理下同名冲突的PRODCODE列即可:

# 提取参考表需要用到的列,避免冗余
df_ref = df2[['MANUF', 'PRODTYPE', 'PRODCODE']]
# 以原df为左表做左连接,保证原df行数不变
df_result = df.merge(
    df_ref,
    on=['MANUF', 'PRODTYPE'], # 显式指定匹配用的键
    how='left',
    suffixes=('_empty', '') # 原df里空的PRODCODE列加后缀,保留参考表匹配到的正确值
)
# 删除原表空的PRODCODE列
df_result.drop(columns='PRODCODE_empty', inplace=True)

方案2:映射赋值(性能更高,适合十万行以上的大表)

先把参考表的对应关系做成字典,直接给df的PRODCODE列赋值,不会产生多余的中间列:

# 构建 (厂商, 产品类型) 到 产品编码的映射字典
prod_map = df2.set_index(['MANUF', 'PRODTYPE'])['PRODCODE'].to_dict()
# 逐行匹配赋值
df['PRODCODE'] = [prod_map.get((m, p)) for m, p in zip(df['MANUF'], df['PRODTYPE'])]
避坑提醒
  • 匹配前先确认两个表的MANUF、PRODTYPE字段数据类型一致,比如一个存的是整数1、一个存的是字符串"1"会完全匹配不上,提前统一类型即可。
  • 如果跑完代码还有PRODCODE为空的行,说明参考表里找不到对应的(MANUF, PRODTYPE)组合,把这些空值行筛出来核对原始数据就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:09:19