Pandas DataFrame自定义学历列表匹配函数无法输出正确匹配结果
问题修复方案
错误根源
- 自定义匹配函数逻辑完全错误:循环内
any语句重复声明了循环变量match,判断规则变为只要预设列表中任意一项存在于目标文本的拆分词中,就把当前遍历的所有预设项都加入结果,和逐一枚举匹配的需求完全不符;同时把目标文本按空格拆分为单个词,无法匹配Bachelor's Degree这类包含空格的多词学历项。 - 预设学历列表存在冗余空格:
NiTEC末尾带有多余空格,若目标文本中NiTEC后无空格会出现匹配失败的情况。
修复后代码
1. 修正匹配函数
def returnhits(a_list, long_string): matches = [] for qual in a_list: # 先去除学历项的前后冗余空格,再判断完整学历是否存在于目标文本中 cleaned_qual = qual.strip() if cleaned_qual in long_string: matches.append(cleaned_qual) return ' , '.join(matches)
2. 优化预设学历列表(去除冗余空格)
qualification_list = ('Professional Certificate', 'NiTEC', "Bachelor's Degree", 'Diploma', 'Advanced/Higher/Graduate Diploma', 'Post Graduate Diploma' , 'Professional Degree', "Master's Degree" , 'Doctorate (PhD)')
3. 原有调用逻辑无需修改
df['Qualifications'] = df['Other information'].apply(lambda x : returnhits(qualification_list, x))
可选进阶优化
如果需要避免短学历项被误匹配(比如Diploma同时匹配到Diploma和Post Graduate Diploma导致重复命中),可以加入最长匹配优先规则和正则词边界匹配,避免部分匹配的问题:
import re def returnhits(a_list, long_string): matches = [] # 按学历项长度降序排列,优先匹配更长的学历,避免短项先匹配导致重复 sorted_quals = sorted(a_list, key=lambda x: len(x.strip()), reverse=True) for qual in sorted_quals: cleaned_qual = qual.strip() # 正则匹配完整词边界,避免部分字符匹配 if re.search(rf'\b{re.escape(cleaned_qual)}\b', long_string): matches.append(cleaned_qual) return ' , '.join(matches)
内容的提问来源于stack exchange,提问作者Randy Chng
相关产品推荐
相关产品推荐

