pandas合并两个DataFrame时仅保留左表每行首个匹配结果的实现方法
要实现df1每行仅匹配df2第一个对应行的需求,最高效的实现方式是提前对df2按连接键去重,仅保留每个键的第一条记录后再执行merge,避免生成不必要的笛卡尔积结果。
实现代码
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'] } ) # 第一步:对df2按连接键去重,保留每个键的第一条记录 df2_first = df2.drop_duplicates(subset='col_4', keep='first') # 第二步:执行合并 result = pd.merge(df1, df2_first, on='col_4')
如果你的匹配逻辑需要更灵活的控制(比如需要同时满足其他字段筛选条件再取首行),可以先执行merge再按df1的原始行分组取首行,示例如下:
# 给df1添加临时行号用于分组 df1['tmp_row_id'] = range(len(df1)) merged = pd.merge(df1, df2, on='col_4') # 按临时行号分组,每组仅保留第一行 result = merged.groupby('tmp_row_id').head(1).drop(columns='tmp_row_id').reset_index(drop=True)
两种方法得到的结果完全一致,都是预期的仅匹配df2首行的结果。
内容的提问来源于stack exchange,提问作者Avv
相关产品推荐
相关产品推荐

