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

如何在Python Jupyter Notebook中拆分全名为名、中间名、姓?

姓名拆分解决方案(含特殊姓氏处理)

基础情况处理(2段/3段姓名)

你的初始代码用str.split(' ',n=2,expand=True)的问题是,当姓名只有2段时,Middle Name会出现空值,只需补充空值替换逻辑就能得到期望输出:

import pandas as pd

df = pd.read_excel("Sample.xlsx")
# 按空格拆分,最多拆为3列
split_cols = df['Full Name'].str.split(' ', n=2, expand=True)
split_cols.columns = ['First Name', 'Middle Name', 'Last Name']
# 将空值统一替换为N/A
split_cols = split_cols.fillna('N/A')
# 合并到原数据框
df = pd.concat([df, split_cols], axis=1)

特殊姓氏场景处理(带连字符/多词姓氏)

针对Rani Amol Sharma-Warma(带连字符姓氏)或Disha Sharma Warma(多词无中间名)这类情况,需要自定义逻辑区分中间名和姓氏,以下是两种实用思路:

思路1:优先识别带连字符的姓氏

如果姓氏包含连字符,直接将最后一个带连字符的词作为姓氏,剩余部分按常规拆分:

def split_name(name):
    parts = name.split()
    if len(parts) == 1:
        return (parts[0], 'N/A', 'N/A')
    elif len(parts) == 2:
        return (parts[0], 'N/A', parts[1])
    else:
        # 检查最后一段是否含连字符
        if '-' in parts[-1]:
            first = parts[0]
            middle = ' '.join(parts[1:-1]) if len(parts[1:-1]) > 0 else 'N/A'
            last = parts[-1]
        else:
            # 无连字符时,默认将最后多段合并为姓氏(可根据实际需求调整)
            first = parts[0]
            middle = 'N/A'
            last = ' '.join(parts[1:])
        return (first, middle, last)

# 应用拆分函数到全名列
df[['First Name', 'Middle Name', 'Last Name']] = df['Full Name'].apply(
    lambda x: pd.Series(split_name(x))
)

测试效果:

  • Rani Amol Sharma-Warma → ('Rani', 'Amol', 'Sharma-Warma')
  • Disha Sharma Warma → ('Disha', 'N/A', 'Sharma Warma')
  • Kumar Krishnan Menon → ('Kumar', 'Krishnan', 'Menon')

思路2:自定义姓氏白名单(精准匹配)

如果数据中有固定的多词姓氏,可维护白名单实现精准拆分:

# 示例姓氏白名单,根据实际场景扩展
LAST_NAME_WHITELIST = {'Sharma Warma', 'Smith Jones'}

def split_name_with_whitelist(name):
    parts = name.split()
    if len(parts) == 1:
        return (parts[0], 'N/A', 'N/A')
    # 从后往前匹配白名单中的姓氏
    for i in range(len(parts)-1, 0, -1):
        candidate_last = ' '.join(parts[i:])
        if candidate_last in LAST_NAME_WHITELIST:
            first = parts[0]
            middle = ' '.join(parts[1:i]) if i > 1 else 'N/A'
            last = candidate_last
            return (first, middle, last)
    # 无匹配时按常规规则拆分
    if len(parts) == 2:
        return (parts[0], 'N/A', parts[1])
    else:
        return (parts[0], ' '.join(parts[1:-1]), parts[-1])

# 应用拆分函数
df[['First Name', 'Middle Name', 'Last Name']] = df['Full Name'].apply(
    lambda x: pd.Series(split_name_with_whitelist(x))
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:57:16