You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式清理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 17:10:37