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

如何基于两个pandas DataFrame的匹配条件添加新列

解决方案:在DataFrame中基于多列匹配生成标记列

嘿,我来帮你搞定这个需求!要在d1中生成符合规则的新列E,用pandas有几种简洁的方法,下面我给你详细演示:

第一步:构造示例数据

先把你给出的d1和d2用代码还原出来,方便直接运行测试:

import pandas as pd

# 构造d1
d1 = pd.DataFrame({
    'A': ['X', 'Y', 'B', 'D', 'L'],
    'B': [6, 3, 5, 11, 10],
    'C': [7, 4, 8, 7, 1],
    'D': [23, 35, 45, 15, 5]
})

# 构造d2
d2 = pd.DataFrame({
    'A': ['Y', 'L', 'D'],
    'C': [4, 1, 7]
})

方法1:使用merge左连接实现(高效推荐)

这种方法利用pandas的向量化操作,处理大数据量时效率更高:

# 按A、C列左连接d1和d2
merged = d1.merge(d2, on=['A', 'C'], how='left')
# 判断每行是否匹配成功,转为1/0标记
d1['E'] = merged.notna().any(axis=1).astype(int)

原理说明:

  • 左连接后,匹配成功的行不会出现NaN值,未匹配的行则会有NaN填充
  • notna().any(axis=1)检查每行是否存在非空值(即是否匹配),返回布尔值
  • astype(int)把布尔值转成1(匹配成功)和0(匹配失败)

方法2:利用元组集合判断(逻辑直观)

如果你想更直观地理解匹配逻辑,可以用这种方法:

# 把d2中A、C列的匹配对转成元组集合,提升查询效率
match_pairs = set(zip(d2['A'], d2['C']))
# 遍历d1每行,判断(A,C)是否在匹配集合中
d1['E'] = d1.apply(lambda row: 1 if (row['A'], row['C']) in match_pairs else 0, axis=1)

原理说明:

  • zip(d2['A'], d2['C'])生成每个匹配对的元组,比如('Y',4)、('L',1)
  • 转成集合后,元素查询的速度会比列表快很多
  • apply逐行遍历d1,返回对应的标记值

最终结果

运行任意一种方法后,d1都会变成你想要的样子:

A   B  C   D  E
0  X   6  7  23  0
1  Y   3  4  35  1
2  B   5  8  45  0
3  D  11  7  15  1
4  L  10  1   5  1

两种方法都能完美处理两个DataFrame行数不同的情况,你可以根据自己的习惯和数据量大小选择合适的方式~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:51:35