如何在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
相关产品推荐
相关产品推荐

