如何将DataFrame中的姓名字符串按空格拆分为名、中间名、姓、后缀四列
Pandas 姓名字段拆分解决方案
核心实现(正则匹配,推荐)
利用str.extract的命名捕获组可以一步完成四个字段的提取,自动填充空值对应不存在的中间名、后缀:
# 定义姓名匹配规则,仅适配当前数据集仅存在Jr作为后缀的场景 name_pattern = r'^(?P<first_name>\w+)(?:\s(?P<middle_name>\w+))?(?:\s(?P<last_name>\w+))?(?:\s(?P<suffix>Jr))?$' # 提取字段并合并到原DataFrame,空值默认填充NaN,可加fillna('')替换为空字符串 df = df.join(df['name'].str.extract(name_pattern).fillna(''))
规则说明
- 第一个捕获组
(?P<first_name>\w+)匹配第一个单词,对应名 - 后续三个都是可选捕获组,分别匹配中间名、姓、仅
Jr的后缀 - 没有对应字段的行自动填充为空,不需要额外处理边界情况
分步实现(无正则版本)
如果不熟悉正则语法,可以分步骤处理,逻辑更直观:
- 先提取后缀
df['suffix'] = df['name'].apply(lambda x: 'Jr' if x.endswith(' Jr') else '')
- 移除原姓名字段中的后缀
df['clean_name'] = df['name'].str.replace(r' Jr$', '', regex=True)
- 拆分清洗后的姓名为前三个字段
df[['first_name', 'middle_name', 'last_name']] = df['clean_name'].str.split(' ', expand=True).reindex(columns=[0,1,2]).fillna('') # 移除临时生成的clean_name列 df = df.drop('clean_name', axis=1)
两种方案运行后都能得到你需要的first_name、middle_name、last_name、suffix四个字段。
内容的提问来源于stack exchange,提问作者reece
相关产品推荐
相关产品推荐

