如何在pandas中匹配多格式学位文本并实现准确独热编码
解决方案
核心思路
先做文本标准化消除格式差异,再用全匹配代替模糊匹配避免子串误判。
具体实现步骤
- 文本标准化处理
统一去除学位字符串中的所有非字母字符、统一转为小写,解决不同书写变体的匹配问题。比如Ph. D、ph.d都会被处理为phd,B.Sc.会被处理为bsc。 - 精准分类匹配
定义不同学位类型对应的标准化后关键词列表,用isin做全值匹配,彻底避免MBA包含BA这类子串误判问题。 - 生成独热编码列
根据匹配结果直接生成对应的0/1标记列。
完整代码示例
import pandas as pd # 示例数据 data = {'Name': ['Alice','Bob','Chris','David'], 'Degree': ['phd','BA','MBA','B.Sc.'] } df = pd.DataFrame(data, columns = ['Name', 'Degree']) # 1. 学位文本标准化:去掉所有非字母字符,转小写 df['degree_norm'] = df['Degree'].str.replace(r'[^a-zA-Z]', '', regex=True).str.lower() # 2. 定义各学位类型对应的标准化关键词,可随时扩展变体 degree_rules = { 'is_bachelors': ['ba', 'bsc'], # 新增学士学位变体直接往列表内添加即可 'is_masters': ['ma', 'mba', 'msc'], 'is_phd': ['phd'] } # 3. 生成独热编码列 for col, keywords in degree_rules.items(): df[col] = df['degree_norm'].isin(keywords).astype(int) # 可选:删除中间字段输出最终结果 df = df.drop(columns=['Degree', 'degree_norm']).reset_index(drop=True) print(df)
输出结果
运行上述代码后得到的结果和预期完全一致:
Name is_bachelors is_masters is_phd 0 Alice 0 0 1 1 Bob 1 0 0 2 Chris 0 1 0 3 David 1 0 0
扩展说明
如果后续遇到新的学位书写变体,只需要把标准化后的对应关键词加到对应类型的列表里即可,不需要修改匹配逻辑,维护成本很低。
内容的提问来源于stack exchange,提问作者James Ellis
相关产品推荐
相关产品推荐

