基于另一个DataFrame的多列匹配标记DataFrame行
为Pandas DataFrame添加存在性标记的高效实现方式
针对你的需求——给df1新增Paired列,标记该行的A、B列组合是否存在于df2中,这里提供几种简洁且高效的实现方案:
方案一:使用merge(最简洁的向量化实现)
利用Pandas的merge方法结合indicator参数,一步完成标记:
import pandas as pd # 构造输入数据 df1 = pd.DataFrame({'A': [1,2,3,4], 'B': [9,8,7,6]}) df2 = pd.DataFrame({'A': [2,4], 'B': [8,6]}) # 左连接并生成标记列 df1 = df1.merge(df2, on=['A', 'B'], how='left', indicator='Paired') # 将标记转换为布尔值:'both'表示组合同时存在于两个DataFrame df1['Paired'] = df1['Paired'] == 'both'
执行后df1的结果如下:
| A | B | Paired |
|---|---|---|
| 1 | 9 | False |
| 2 | 8 | True |
| 3 | 7 | False |
| 4 | 6 | True |
这种方法是Pandas原生的向量化操作,效率极高,代码也最简洁,适合绝大多数场景。
方案二:利用集合查询(大数据量下更高效)
如果数据集规模极大,可先将df2的A、B组合转换为集合(集合查询时间复杂度为O(1)),再批量判断:
# 将df2的A、B组合转为集合 pair_set = set(df2.itertuples(index=False, name=None)) # 批量判断df1的每行组合是否在集合中 df1['Paired'] = df1.itertuples(index=False, name=None).isin(pair_set)
这种方法避免了DataFrame的连接操作,在超大规模数据下性能会略优于merge,代码也相对简洁。
补充说明
因为你提到两个DataFrame的A、B列组合均唯一,所以以上两种方案都不会出现重复匹配的问题,结果完全可靠。
内容的提问来源于stack exchange,提问作者NaiveBayesian
相关产品推荐
相关产品推荐

