如何在Pandas中基于多列匹配值高效合并两个DataFrame?
使用Pandas高效实现DataFrame匹配合并
先构造你提供的示例数据,方便直接测试:
import pandas as pd # 第一个DataFrame df1 = pd.DataFrame({ 'Column A': ['id1', 'id2', 'id3'], 'Column B': ['name1', 'name2', 'name3'] }) # 第二个DataFrame df2 = pd.DataFrame({ 'Column X1': ['name1', 'name6', 'name3'], 'Column X2': ['name4', 'name2', 'name8'], 'Column Y': ['company1', 'company2', 'company3'] })
你的需求核心是:让df1的Column B与df2的Column X1/Column X2双向匹配,取对应另一列作为New_Column,同时关联Column Y。用循环效率极低,用Pandas的向量化操作可以高效解决:
步骤1:生成双向匹配映射表
把df2拆成两个方向的匹配关系,再合并成统一的映射表:
# 方向1:以X1为匹配名,X2为对应值 map_from_x1 = df2.rename(columns={'Column X1': 'match_name', 'Column X2': 'New_Column'})[['match_name', 'New_Column', 'Column Y']] # 方向2:以X2为匹配名,X1为对应值 map_from_x2 = df2.rename(columns={'Column X2': 'match_name', 'Column X1': 'New_Column'})[['match_name', 'New_Column', 'Column Y']] # 合并两个映射表 mapping_df = pd.concat([map_from_x1, map_from_x2], ignore_index=True)
步骤2:关联原DataFrame得到结果
用merge做左连接,匹配df1的Column B和映射表的match_name,最后清理冗余列:
result = df1.merge(mapping_df, left_on='Column B', right_on='match_name', how='left').drop('match_name', axis=1)
运行后得到的结果完全符合你的目标:
| Column A | Column B | New_Column | Column Y |
|---|---|---|---|
| id1 | name1 | name4 | company1 |
| id2 | name2 | name6 | company2 |
| id3 | name3 | name8 | company3 |
这种方法全程用Pandas内置的向量化操作,比循环快几个数量级,数据量越大优势越明显。如果df2存在重复匹配项,可以先通过drop_duplicates(subset='match_name')去重,或者根据需求保留特定条目。
内容的提问来源于stack exchange,提问作者user20505088
相关产品推荐
相关产品推荐

