如何用正则表达式清理DataFrame姓名列:移除逗号后首词后续内容
问题:清理DataFrame中的姓名列,移除逗号后首词后的多余内容
原始数据与需求
用户有一个包含多种姓名格式的DataFrame列,需要清理成逗号后仅保留第一个单词的格式:
原始数据代码:
import pandas as pd import re d = {'names':['smith,john s','smith, john', 'brown, bob s', 'brown, bob']} x = pd.DataFrame(d)
期望输出:['smith,john','smith, john', 'brown, bob', 'brown, bob']
原代码的问题分析
用户尝试的代码存在三个核心问题:
- 正则错误使用
/作为分隔符:Python的re模块不需要用/包裹正则模式,这会直接导致无法匹配目标内容 - 循环中冗余的
str(x):循环变量x已经是字符串类型的姓名,无需再次转换 - 正则逻辑不匹配需求:原正则
/.\s+[^\s,]+/无法精准定位逗号后第一个单词之后的多余内容
正确解法
方法1:正则表达式替换(高效简洁)
用正则匹配逗号后第一个单词之外的尾部内容,直接替换为空:
x['names'] = x['names'].str.replace(r'(?<=,\s*\w)\s+.+$', '', regex=True)
或者通过捕获组保留需要的部分:
x['names'] = x['names'].apply(lambda name: re.sub(r'(,\s*\w+)\s+.+$', r'\1', name))
方法2:字符串分割提取(直观易读)
通过分割字符串的方式,只保留逗号后第一个单词:
x['names'] = x['names'].apply(lambda s: ','.join([part.split()[0] if i == 1 else part for i, part in enumerate(s.split(','))]))
也可以用str.extract直接提取目标内容:
x['names'] = x['names'].str.extract(r'^(\w+,\s*\w+)', expand=False)
验证结果
运行上述任意一种方法后,x['names']的输出都会符合预期:
0 smith,john 1 smith, john 2 brown, bob 3 brown, bob Name: names, dtype: object
内容的提问来源于stack exchange,提问作者chicagobeast12
相关产品推荐
相关产品推荐

