Pandas使用正则提取姓名列头衔生成新列全返回Other如何解决
错误原因
- 正则捕获与取值错误:正则
\s([A-Za-z]+)\.的捕获组仅匹配头衔的字母部分(比如捕获结果是Mr而非Mr.),且groups()方法返回的是元组类型,不是字符串,无法和后续判断条件匹配 - 判断条件格式错误:所有条件中的头衔都额外加了
.后缀,和实际捕获到的无点字符串完全不匹配,导致所有请求都进入Other分支 - 冗余代码无效:末尾的
dict_title是数字到分类的映射,但是search_title返回的已经是分类字符串,该替换逻辑无任何实际作用
修复后可正常运行的代码
import os import pandas as pd import re filename = os.path.join(os.path.dirname(__file__),'train.csv') data = pd.read_csv(filename) def create_title_column(data, colname): def search_title(x): title_search = re.search('\s([A-Za-z]+)\.', x) if title_search: # 取第一个捕获组的字符串,不带点 title = title_search.group(1) if title == 'Rev': return 'Clerical' elif title == 'Master': return 'Scholar' elif title == 'Dr': return 'Doctor' elif title in ['Major', 'Col', 'Capt']: return 'Military' elif title in ['Mr','Mrs','Ms','Miss']: return 'Commoner' elif title in ['Don','Sir','Mme','Mlle','Lady','Countess','Jonkheer']: return 'Nobility' return 'Other' return data[colname].apply(search_title) data['Title'] = create_title_column(data, 'Name') print(data.head(10))
更简洁的实现方案
直接使用pandas内置的字符串方法 + 映射字典实现,无需自定义多层函数,可读性更高:
import os import pandas as pd filename = os.path.join(os.path.dirname(__file__),'train.csv') data = pd.read_csv(filename) # 构建头衔到分类的映射字典 title_map = { 'Rev': 'Clerical', 'Master': 'Scholar', 'Dr': 'Doctor', 'Major': 'Military', 'Col': 'Military', 'Capt': 'Military', 'Mr': 'Commoner', 'Mrs': 'Commoner', 'Ms': 'Commoner', 'Miss': 'Commoner', 'Don': 'Nobility', 'Sir': 'Nobility', 'Mme': 'Nobility', 'Mlle': 'Nobility', 'Lady': 'Nobility', 'Countess': 'Nobility', 'Jonkheer': 'Nobility' } # 一步提取头衔+映射分类,未匹配到的默认返回Other data['Title'] = data['Name'].str.extract('\s([A-Za-z]+)\.', expand=False).map(title_map).fillna('Other') print(data.head(10))
内容的提问来源于stack exchange,提问作者Robin Sage
相关产品推荐
相关产品推荐

