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

如何在Pandas中合并两个DataFrame并仅保留首次匹配项

问题:按匹配项的出现次数合并两个DataFrame,仅保留首次匹配的对应项

现有两个DataFrame:
df1:

match
0     a
1     a
2     b

df2:

match  number
0     a       1
1     b       2
2     a       3
3     a       4

需求是合并这两个DataFrame,仅保留每个匹配项在df1中对应次数的首次匹配项,最终得到如下结果:

match_df1  match_df2  number
0         a          a       1
1         a          a       3
2         b          b       2

尝试过inner join、merge和pd.concat的多种组合都无法得到预期输出,希望找到无需循环、纯用Pandas方法的Pythonic实现方式。


自行尝试的解决方案(待优化)

df = pd.merge(df1, df2, on='match').drop_duplicates('number')
for match, count in df1['match'].value_counts().iteritems():
    df = df.drop(index=df[df['match'] == match][count:].index)

优化的Pythonic实现方案

可以通过给两个DataFrame按match分组后添加组内序号,再基于match和序号进行匹配,就能实现无循环的高效合并:

步骤如下:

  1. 给df1按match分组,添加组内递增的序号列seq
  2. 给df2按match分组,添加组内递增的序号列seq
  3. 基于match和seq进行inner merge
  4. 重命名列并调整顺序得到预期结果

代码实现:

import pandas as pd

# 原始数据
df1 = pd.DataFrame({'match': ['a', 'a', 'b']})
df2 = pd.DataFrame({'match': ['a', 'b', 'a', 'a'], 'number': [1, 2, 3, 4]})

# 添加组内序号
df1['seq'] = df1.groupby('match').cumcount()
df2['seq'] = df2.groupby('match').cumcount()

# 基于match和seq合并
result = pd.merge(df1, df2, on=['match', 'seq'], suffixes=('_df1', '_df2'))

# 调整列顺序并重置索引(可选)
result = result[['match_df1', 'match_df2', 'number']].reset_index(drop=True)

print(result)

运行结果:

match_df1  match_df2  number
0         a          a       1
1         a          a       3
2         b          b       2

这个方案完全避免了循环,利用Pandas的分组计数和合并特性,逻辑清晰且效率更高,适合处理大规模数据。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:24:23