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

如何在Pandas合并DataFrame时加入指定列取值的关联条件

Pandas merge 自定义关联条件实现方案

Pandas 原生的pd.merge()暂不支持直接在关联键参数中写入自定义条件表达式,无法像SQL那样直接在JOIN ON子句中追加多条件判断,目前主流有两种实现方式:

  • 方案1:新增临时关联键(最常用、性能最优)
    就是你目前在用的方案,虽然多了一步新增临时列的操作,但执行效率远高于关联后过滤,代码示例如下:
import pandas as pd

# 测试数据集
a =  pd.DataFrame({"ColA":["num 1", "num 2", "num 3"],
                   "ColB":[5,6,7],
                   "ColC":[1,1,0]})
b =  pd.DataFrame({"ColA":["num 1", "num 2", "num 4"],
                   "Colx":[10,16,71],
                   "Coly":[0,0,0]})

# 新增临时关联键:a表满足ColC==1时取0,和b表Coly的值匹配,其余情况取无法匹配的值
a['_tmp_join_key'] = a['ColC'].apply(lambda x: 0 if x == 1 else -1)
b['_tmp_join_key'] = b['Coly']

# 左连接后删除临时列和不需要的Coly列
res = pd.merge(a, b, left_on=['ColA', '_tmp_join_key'], right_on=['ColA', '_tmp_join_key'], how='left')
res = res.drop(columns=['_tmp_join_key', 'Coly'])

运行结果和你预期的输出完全一致。

  • 方案2:先关联后过滤(无需新增临时列)
    先按公共字段ColA做左连接,再保留符合关联条件的行,同时保留a表未关联成功的所有行,代码示例如下:
# 先按ColA左连接
temp_df = pd.merge(a, b, on='ColA', how='left')
# 过滤规则:要么关联成功且满足a.ColC==1、b.Coly==0,要么未关联上直接保留a的行
res = temp_df[((temp_df['ColC'] == 1) & (temp_df['Coly'] == 0)) | temp_df['Colx'].isna()].drop(columns='Coly')

两种方案最终输出结果均为:

ColA  ColB  ColC  Colx
0  num 1     5     1  10.0
1  num 2     6     1  16.0
2  num 3     7     0   NaN

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:54:06