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

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

相关产品推荐
方舟 Agent Plan

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

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