使用pandas.str.split提取泰坦尼克号数据集头衔出现重复序列问题
这个问题我之前处理泰坦尼克号数据集时也碰到过,核心是提取的头衔藏了前导空格,再加上split方法的小细节没处理好,咱们一步步解决:
先搞懂问题出在哪
你用str.split('[,.]')提取的头衔,看起来显示是Mr,但实际是带前导空格的字符串(比如' Mr')——不信你可以打印data.Title.str.len()看看,正常Mr长度是2,带空格的版本长度是3。这就是为什么data.Title == 'Mr'会全返回False,因为字符串实际不相等;而索引单行出现重复,大概率是原Series处理时没对齐索引,加上空格问题放大了异常。
解决方案一:给提取的结果做空格清理
直接在提取后加上str.strip(),把前后的空格都去掉:
# 重新提取并清理空格 data['Title'] = data.Name.str.split('[,.]').str.get(1).str.strip()
执行完这段代码后,你再试:
data.Title[0]会返回单纯的'Mr',不会有重复索引data.Title == 'Mr'能正常返回True/False,过滤数据集也能正常工作
解决方案二:用正则直接提取(更推荐)
比起split后再处理空格,用正则表达式直接匹配头衔更精准,一步到位:
data['Title'] = data.Name.str.extract(r',\s*(\w+)', expand=False)
这个正则的逻辑是:匹配姓名里的逗号,,跳过逗号后面任意数量的空白字符\s*,然后直接捕获后面的单词(\w+)——也就是我们要的头衔,完全不需要额外处理空格。
验证效果
做完上面的操作后,你可以做几个简单验证:
- 查看单行值:
print(data.Title[0]),输出应该是Mr - 筛选验证:
data[data.Title == 'Mr'],能正常筛选出头衔为Mr的所有行 - 查看唯一值:
print(data.Title.unique()),会得到干净的头衔列表,比如['Mr', 'Mrs', 'Miss', 'Master', 'Dr']这类
内容的提问来源于stack exchange,提问作者Lita
相关产品推荐
相关产品推荐

