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
相关产品推荐
相关产品推荐

