如何高效快速实现3个DataFrame的Join操作并保留重复列?
多DataFrame Join并保留重复列的便捷实现方法
要实现和你给出的SQL等价的多表Join,同时保留各表的重复列(比如三个id列),用pandas可以通过链式Merge或者索引式Join高效完成,以下是具体实现:
方法一:链式Merge(直观易读)
利用pd.merge()的suffixes参数区分不同表的重复列,链式完成三次表的连接:
1. 准备示例数据
import pandas as pd # 模拟你的三个业务表 tbl_1 = pd.DataFrame({'id': [1, 2, 3], '其他列1': ['a1', 'a2', 'a3']}) tbl_2 = pd.DataFrame({'id': [2, 3, 4], '其他列2': ['b2', 'b3', 'b4']}) tbl_3 = pd.DataFrame({'id': [2, 3, 5], '其他列3': ['c2', 'c3', 'c5']})
2. 分步合并并保留重复列
# 第一步:合并tbl_1和tbl_2,用后缀区分两个表的id列 merged_t1_t2 = pd.merge(tbl_1, tbl_2, on='id', suffixes=('_tbl1', '_tbl2')) # 第二步:将合并结果与tbl_3合并,匹配tbl_2的id和tbl_3的id final_merge = pd.merge(merged_t1_t2, tbl_3, left_on='id_tbl2', right_on='id', suffixes=('', '_tbl3')) # 提取对应SQL SELECT的列(三个id列) result = final_merge[['id_tbl1', 'id_tbl2', 'id_tbl3']]
最终result会保留三个表的id列,和SQL查询结果完全一致,且默认使用INNER JOIN(和你的SQL逻辑匹配)。
方法二:索引式Join(大数据量下更高效)
如果数据量较大,将连接键设为索引后用join()方法性能更好——索引的查找效率远高于普通列:
# 先给每个表的id列重命名,并设置为索引 tbl_1_idx = tbl_1.rename(columns={'id': 'id_tbl1'}).set_index('id_tbl1') tbl_2_idx = tbl_2.rename(columns={'id': 'id_tbl2'}).set_index('id_tbl2') tbl_3_idx = tbl_3.rename(columns={'id': 'id_tbl3'}).set_index('id_tbl3') # 链式执行INNER JOIN final_join = tbl_1_idx.join(tbl_2_idx, how='inner', on='id_tbl1').join(tbl_3_idx, how='inner', on='id_tbl2') # 重置索引并提取目标列 result = final_join.reset_index()[['id_tbl1', 'id_tbl2', 'id_tbl3']]
关键注意点
- 若需要其他类型的JOIN(比如LEFT JOIN),只需在
merge()或join()中指定how='left'即可; suffixes参数可以自定义后缀,只要能区分不同表的重复列就行;- 大数据量下优先用索引式Join,提前给连接键设置索引能大幅提升合并速度。
内容的提问来源于stack exchange,提问作者marcin2x4
相关产品推荐
相关产品推荐

