如何基于df1的多列匹配df2的id3实现两个Pandas DataFrame的合并
实现方案
方法1:宽转长匹配(扩展性更强)
核心思路是把df1的多个待匹配id列转换为统一的长格式匹配列,和df2匹配完成后再关联回原df1的宽表结构,适合后续需要扩展更多匹配列的场景:
import pandas as pd # 构造测试数据 df1 = pd.DataFrame({'id1':[3,2,1,4,5],'id2':[8,7,6,9,10]}) df2 = pd.DataFrame({'id3':[6,2,8,5,4],'Name':['a','b','c','e','d']}) # 给df1添加行标记,保留原行顺序 df1['row_id'] = df1.index # 把id1、id2转换为长格式匹配列 df1_melt = df1.melt(id_vars='row_id', value_vars=['id1', 'id2'], value_name='match_id') # 和df2完成匹配 match_result = df1_melt.merge(df2, left_on='match_id', right_on='id3', how='inner') # 关联回原df1,删除冗余列得到最终结果 final = df1.merge(match_result[['row_id', 'id3', 'Name']], on='row_id').drop(columns='row_id')
输出final即可得到目标结果:
id1 id2 id3 Name 0 3 8 8 c 1 2 7 2 b 2 1 6 6 a 3 4 9 4 d 4 5 10 5 e
方法2:双匹配合并(代码更简洁)
如果只有2个匹配列,可以直接分别按id1、id2匹配df2后合并结果:
merge_by_id1 = df1.merge(df2, left_on='id1', right_on='id3', how='inner') merge_by_id2 = df1.merge(df2, left_on='id2', right_on='id3', how='inner') final = pd.concat([merge_by_id1, merge_by_id2]).sort_values('id1').reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Prakash Dahal
相关产品推荐
相关产品推荐

