如何在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和序号进行匹配,就能实现无循环的高效合并:
步骤如下:
- 给df1按
match分组,添加组内递增的序号列seq - 给df2按
match分组,添加组内递增的序号列seq - 基于
match和seq进行inner merge - 重命名列并调整顺序得到预期结果
代码实现:
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
相关产品推荐
相关产品推荐

