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

如何检测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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:27:21