Pandas合并两个含匹配ID列的DataFrame,为DF1新增CODE列且行数不变
问题成因
- 原有代码同时传入
on='ID'和right_index=True参数,pandas执行合并时的匹配逻辑为:取DF1的ID列值匹配DF2的行索引,而非DF2自身的ID列。如果DF2的行索引和ID列取值没有一一对应,就会出现错误匹配,甚至产生多对一/一对多的匹配关系,最终导致合并后行数异常增加。 how='inner'的合并逻辑会过滤掉DF1中不存在于匹配端的ID,若要严格保证DF3行数和DF1完全一致,优先使用左连接how='left'更稳妥。
解决方案
方案1:直接按双表的ID列合并(最简便)
直接指定匹配列为两表共有的ID,无需关联索引:
DF3 = DF1.merge(DF2, on='ID', how='left')
因为DF2中每个ID对应唯一值,合并后DF3的行数会和DF1完全一致,且每行会自动匹配对应ID的CODE值。
方案2:通过索引匹配(适合需要将ID设为DF2索引的场景)
如果需要保留用右表索引匹配的逻辑,先将DF2的ID列设置为行索引再合并:
# 先将DF2的ID设为行索引 DF2_with_id_index = DF2.set_index('ID') # 合并:左表用ID列匹配右表索引 DF3 = DF1.merge(DF2_with_id_index, left_on='ID', right_index=True, how='left')
合并后可执行len(DF3) == len(DF1)验证行数是否符合要求,返回True即为正常。
内容的提问来源于stack exchange,提问作者dinn_
相关产品推荐
相关产品推荐

