如何检测DataFrame列字符串/子串是否存在于另一DataFrame列中
pandas跨表列值匹配:同时支持完全匹配与子串检测
你当前写的isin()方法仅能实现两列值的完全等值匹配,无法覆盖子串包含的匹配场景,直接通过正则拼接的矢量化实现就能同时满足两种匹配需求,不需要写低效的多层循环。
实现代码
import re import numpy as np # 预处理df2的VM列:去空、转字符串、去重、转义正则特殊字符后拼接为匹配模式 vm_match_pattern = '|'.join( re.escape(item) for item in df2['VM'].dropna().astype(str).unique() ) # 同时判断完全匹配+子串匹配 df1['CrowdStrike'] = np.where( # 保留原有的完全匹配逻辑 df1['VM'].isin(df2['VM']) # 新增子串匹配:只要df1当前VM值是df2任意VM值的子串,就命中 | df1['VM'].astype(str).str.contains(vm_match_pattern, regex=True, na=False), 'YES', 'NO' )
匹配规则自定义说明
- 如果你需要双向包含匹配:即df1的VM值和df2任意VM值只要存在互相包含的关系(不管谁是谁的子串)就算命中,只需要额外补充一层反向匹配逻辑即可:把df1的VM值也按相同规则拼成正则模式,对df2做匹配后映射回df1,再和现有判断结果做或运算。
- 如果你只需要df2的VM值是df1当前VM值的子串才算命中,现有代码不需要修改,直接运行即可。
- 代码中加入
re.escape是为了转义VM值里可能存在的正则特殊字符(比如.、*、(这类),避免匹配逻辑出错;na=False用于处理列中的空值,防止空值触发类型报错或判断异常。 - 当数据量超过10万行时,这个矢量化实现的性能比嵌套循环/
apply逐行判断高10~100倍,和原生isin()的性能差距很小,适合大表匹配场景。
内容的提问来源于stack exchange,提问作者tristan.howard
相关产品推荐
相关产品推荐

