如何基于两个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
相关产品推荐
相关产品推荐

