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

