You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并两个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_xcol_1_xcol_2_xcol_3_xcol_4ID_ycol_1_ycol_2_ycol_3_y
11611apple181212
22712apple191313
33813apple3101514
54914apple5111715

内容的提问来源于stack exchange,提问作者Avv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:36:05