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

pandas如何用str.contains替代.isin实现DataFrame列非精确匹配

问题复现与错误原因

Series.str.contains()方法的第一个参数仅支持传入单个字符串/正则表达式对象,直接传入df2.IDs整个Series不符合参数要求,因此触发TypeError: unhashable type: 'Series'报错。

正确实现方案

核心思路是将df2.IDs的所有值拼接为带「或」逻辑的正则表达式,再传入str.contains()完成批量模糊匹配,全程是pandas向量化操作,无显式循环。
为避免匹配值中包含.、*等正则特殊字符导致匹配异常,需要先用re.escape()对每个值做转义处理。

示例代码

import pandas as pd
import re

df1 = pd.DataFrame({'name': ['Marc', 'Jake', 'Sam', 'Brad']})
df2 = pd.DataFrame({'IDs': ['Jake', 'John', 'Marc', 'Tony', 'Bob']})

# 拼接模糊匹配的正则规则
match_pattern = '|'.join(df2['IDs'].apply(re.escape))
# 执行匹配并生成结果
result = df1.assign(In_df2=df1['name'].str.contains(match_pattern).astype(int))

print(result)

输出结果

name  In_df2
0  Marc       1
1  Jake       1
2   Sam       0
3  Brad       0
补充说明
  • 若需要大小写不敏感的模糊匹配,可给str.contains()添加参数case=False
  • 若你的需求是反向判断(即df2.IDs的取值是否被df1.name包含),仅需调换拼接正则的列和执行匹配的列即可
  • 当df2.IDs的条目量级达到十万级以上时,正则拼接可能存在长度超限问题,可改用numpy广播逻辑实现:
    import numpy as np
    match_mask = np.column_stack([df1.name.str.contains(x, regex=False) for x in df2.IDs]).any(axis=1)
    result = df1.assign(In_df2=match_mask.astype(int))
    

内容的提问来源于stack exchange,提问作者Justin Benfit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:54:04