合并两个Python pandas DataFrame并避免重复使用匹配行的实现方法
解决方案
核心思路是给两个DataFrame的匹配键分组内添加顺序行号作为辅助匹配列,合并时同时匹配原键和行号即可实现顺序不重复匹配。
实现代码
import pandas as pd # 示例数据 df1 = pd.DataFrame( { 'ID':[1,2,3,5,9], 'col_1': [1,2,3,4,5], 'col_2':[6,7,8,9,10], 'col_3':[11,12,13,14,15], 'col_4':['apple', 'apple', 'apple', 'apple', 'apple'] } ) df2 = pd.DataFrame( { 'ID':[1,1,3,5], 'col_1': [8,9,10,11], 'col_2':[12,13,15,17], 'col_3':[12,13,14,15], 'col_4':['apple', 'apple', 'apple', 'apple'] } ) # 给两个df添加分组内顺序行号作为辅助列 df1['match_rank'] = df1.groupby('col_4').cumcount() df2['match_rank'] = df2.groupby('col_4').cumcount() # 合并时同时匹配原键和行号,最后删除辅助列 # how='left'保留df1未匹配的行,改成'inner'则只保留两边都有匹配的行 res = pd.merge(df1, df2, on=['col_4', 'match_rank'], how='left').drop('match_rank', axis=1) print(res)
逻辑说明
groupby('col_4').cumcount()会对每个col_4值的分组内的行,按原始顺序生成从0开始的连续序号,相同序号的行就形成了顺序对应的匹配关系- 合并时同时匹配
col_4和match_rank,自动实现df1的第n行匹配df2同分组下的第n行,完全满足「已匹配的df2行不重复使用、首个匹配即停止」的需求 - 该方法是pandas原生向量化操作,性能远高于循环遍历匹配,支持多匹配键、多分组的复杂场景
示例输出(how='inner'时)
| ID_x | col_1_x | col_2_x | col_3_x | col_4 | ID_y | col_1_y | col_2_y | col_3_y |
|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 6 | 11 | apple | 1 | 8 | 12 | 12 |
| 2 | 2 | 7 | 12 | apple | 1 | 9 | 13 | 13 |
| 3 | 3 | 8 | 13 | apple | 3 | 10 | 15 | 14 |
| 5 | 4 | 9 | 14 | apple | 5 | 11 | 17 | 15 |
内容的提问来源于stack exchange,提问作者Avv
相关产品推荐
相关产品推荐

