Python中如何用text.find实现多子串搜索?DataFrame处理遇问题
问题解决:检测招聘启事中的学历关键词
问题根源
你代码里用text.find('bachelor|ba/bs|bs/ba')的问题在于:str.find()不支持正则表达式的管道符|——它会把整个带|的字符串当成一个完整的子串去搜索,而你的招聘文本里显然不会有"bachelor|ba/bs|bs/ba"这种内容,所以每次都返回-1,最终生成全0的列。
修复方案
给你三种可行的修复方式,按需选择:
1. 正则表达式匹配(推荐,支持灵活匹配)
用Python的re模块做正则匹配,支持同时检测多个关键词,还能忽略大小写(适配不同写法的学历表述):
import re def requires_bachelor(text): # re.search找到任意一个匹配就返回结果,IGNORECASE忽略大小写 if re.search(r'bachelor|ba/bs|bs/ba', text, flags=re.IGNORECASE): return True return False df_jobs['bachelor'] = df_jobs['description'].apply(requires_bachelor).map({True:1, False:0})
2. 逐个检查子串(无需正则)
如果不想用正则,直接遍历关键词列表,检查是否有任意一个出现在文本中:
def requires_bachelor(text): keywords = ['bachelor', 'ba/bs', 'bs/ba'] # 转小写后匹配,避免大小写遗漏 return any(keyword in text.lower() for keyword in keywords) # 直接把布尔值转成整数0/1 df_jobs['bachelor'] = df_jobs['description'].apply(requires_bachelor).astype(int)
3. Pandas内置方法(最简洁高效)
Pandas的str.contains()专门处理字符串列的匹配,比apply()效率更高,代码更短:
import re # case=False忽略大小写,na=False处理空值(避免生成NaN) df_jobs['bachelor'] = df_jobs['description'].str.contains( r'bachelor|ba/bs|bs/ba', case=False, na=False ).astype(int)
内容的提问来源于stack exchange,提问作者isa_r
相关产品推荐
相关产品推荐

