Pandas如何新增列标记df1的A列值是否存在于df2的同名列中
实现方案
直接用pandas内置的isin()成员判断方法即可,逻辑简单、执行效率高,是这类值匹配场景的最优选择。
首先是测试数据构造代码(实际使用时跳过这步,直接用你已有的df1、df2即可):
import pandas as pd import numpy as np df1 = pd.DataFrame({'A': ['a1', 'a2', 'a3']}) df2 = pd.DataFrame({'A': ['a1', 'a3', 'a4', 'a7']})
核心实现代码:
# 先把df2的A列转为集合,大数据量下判断速度会快很多 df2_a_values = set(df2['A']) # 写法1:用map把布尔值转成Y/N,不需要额外导入numpy df1['Found in df2?'] = df1['A'].isin(df2_a_values).map({True: 'Y', False: 'N'}) # 写法2:如果你习惯用np.where,也可以用下面这句,效果完全一致 # df1['Found in df2?'] = np.where(df1['A'].isin(df2_a_values), 'Y', 'N')
执行后打印df1,就能得到预期结果:
A Found in df2? 0 a1 Y 1 a2 N 2 a3 Y
注意事项
- 不要直接传入df2的原列做判断:即不要写
df1['A'].isin(df2['A']),小数据量感知不到差异,当数据量超过10万行时,提前转成set类型能让判断速度提升数倍。 - 表合并(merge/join)方法也能实现需求,但需要额外处理合并产生的空值、重复值,代码冗余且执行效率低于isin方案,非必要不选择,参考写法如下:
# 仅作参考,不推荐日常使用 df1 = df1.merge( df2[['A']].drop_duplicates().assign(flag='Y'), on='A', how='left' ) df1['Found in df2?'] = df1['flag'].fillna('N') df1 = df1.drop(columns='flag')
内容的提问来源于stack exchange,提问作者Jakub Sapko
相关产品推荐
相关产品推荐

