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

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))
)

处理后结果参考:

fullnamesFirstNameMiddleNameLastName
Walter John Ross SchmidtWalterJohn RossSchmidt
Zhang SanZhangNaNSan
Alice Mary Elizabeth SmithAliceMary ElizabethSmith
Bob BrownBobNaNBrown

逻辑说明

  • 直接使用无参数的str.split()即可自动处理所有空格问题:自动忽略字符串首尾空格,将连续多个空格识别为单个分隔符,不需要额外编写正则替换空格的逻辑
  • 列表切片[1:-1]会自动取第一个元素、最后一个元素之间的所有内容,当列表总长度为2时,该切片返回空列表,直接赋值空值即可满足2个词时MiddleName为空的要求
  • 兼容了空字符串、单个词、多空格等边界异常场景

内容的提问来源于stack exchange,提问作者Ash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:27:25