Python中如何将姓名拆分为名、中间名、姓列(兼容多段姓名)
可变段数姓名拆分:提取first/middle/last name
解决方案代码
首先构造测试数据并执行拆分逻辑:
import pandas as pd # 构造测试数据集 data = { 'name': [ 'John Smith', 'Jack A Doe', 'Jane Marie Jones Smith', 'Josh Jacob Jingle Hiemer Schmidt' ] } df = pd.DataFrame(data) # 拆分姓名为多列 name_parts = df['name'].str.split(expand=True) # 提取first name:姓名的第一部分 df['first_name'] = name_parts[0] # 提取last name:姓名的最后一部分 df['last_name'] = name_parts.iloc[:, -1] # 提取middle name:中间所有部分拼接,自动忽略空值 df['middle_name'] = name_parts.iloc[:, 1:-1].apply( lambda row: ' '.join(row.dropna().astype(str)), axis=1 ) # 整理结果列 result_df = df[['first_name', 'middle_name', 'last_name']] print(result_df)
输出结果
first_name middle_name last_name 0 John Smith 1 Jack A Doe 2 Jane Marie Jones Smith 3 Josh Jacob Jingle Hiemer Schmidt
问题修正说明
你之前的错误在于将name_parts.iloc[:,1]作为last name,这错误地取了姓名的第二部分。正确逻辑是:
- first name:固定取姓名的第一个部分
- last name:固定取姓名的最后一个部分
- middle name:取姓名中除首尾之外的所有部分,用空格拼接成字符串
关键逻辑细节:
name_parts.iloc[:, -1]:通过负索引直接定位每行的最后一列,适配任意长度的姓名name_parts.iloc[:, 1:-1]:提取从第二列到倒数第二列的所有中间段row.dropna():自动过滤空值,避免短姓名(如2段姓名)产生多余空格
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

