Pandas拆分Full Name字段为FirstName/MiddleName/LastName实现方法
Pandas姓名字段拆分实现
需求规则
拆分fullnames字段的规则如下:
- 全名拆分后的第一个词作为
FirstName - 全名拆分后的最后一个词作为
LastName - 第一个和最后一个词之间的所有内容统一归入
MiddleName,如果全名仅2个词,MiddleName设为空值 - 兼容姓名字符串中存在的首尾空格、中间连续多余空格
原有代码问题
原有解包逻辑将第二个词直接赋值给Middle,剩余所有词都归为Last,不符合「最后一个词才是LastName」的要求。
正确实现
单字符串测试代码
fullname = "Walter John Ross Schmidt" # split()不传参时自动处理多余空格、首尾空格 name_parts = fullname.split() first_name = name_parts[0] last_name = name_parts[-1] middle_name = " ".join(name_parts[1:-1]) if len(name_parts[1:-1]) > 0 else None print(f"FirstName = {first_name}") print(f"Middle = {middle_name}") print(f"Last = {last_name}")
运行输出完全符合预期:
FirstName = Walter Middle = John Ross Last = Schmidt
Pandas DataFrame批量处理代码
针对整列数据的批量处理可以用如下写法,兼容各类边界场景:
import pandas as pd import numpy as np # 示例数据 df = pd.DataFrame({ "fullnames": [ "Walter John Ross Schmidt", "Zhang San", "Alice Mary Elizabeth Smith", " Bob Brown " ] }) def split_name(s): parts = str(s).split() # 极端场景:内容为空或只有1个词的兼容处理 if len(parts) < 2: return (parts[0] if parts else None, np.nan, np.nan) first = parts[0] last = parts[-1] middle = " ".join(parts[1:-1]) if len(parts) > 2 else np.nan return (first, middle, last) # 批量赋值三列 df[["FirstName", "MiddleName", "LastName"]] = df["fullnames"].apply( lambda x: pd.Series(split_name(x)) )
处理后结果参考:
| fullnames | FirstName | MiddleName | LastName |
|---|---|---|---|
| Walter John Ross Schmidt | Walter | John Ross | Schmidt |
| Zhang San | Zhang | NaN | San |
| Alice Mary Elizabeth Smith | Alice | Mary Elizabeth | Smith |
| Bob Brown | Bob | NaN | Brown |
逻辑说明
- 直接使用无参数的
str.split()即可自动处理所有空格问题:自动忽略字符串首尾空格,将连续多个空格识别为单个分隔符,不需要额外编写正则替换空格的逻辑 - 列表切片
[1:-1]会自动取第一个元素、最后一个元素之间的所有内容,当列表总长度为2时,该切片返回空列表,直接赋值空值即可满足2个词时MiddleName为空的要求 - 兼容了空字符串、单个词、多空格等边界异常场景
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

