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

如何用Python(Pandas/Numpy)从不等长单列拆分三列姓名数据

姓名拆分解决方案:称谓、名、姓分离

你的代码问题所在

  • 第一段代码:你直接将 pandas Series(x)与称谓列表做比较,in 运算符会检查整个Series是否在列表中(而非逐个元素判断),导致所有行的分配逻辑错误。
  • 第二段代码:嵌套循环会生成第一部分和第二部分的笛卡尔积,导致称谓、名字列表的长度与姓氏列表不匹配,出现大量重复条目。

正确实现方式

我们可以用 pandas 的 apply 函数逐行处理姓名,同时将称谓转为集合类型以加快查找速度(集合的成员检查效率远高于列表)。

import pandas as pd

# 示例数据
data = {'Names': ['Simon Cool', 'Mrs. Sarah Smart', 'Mr Harry Adams', 'Rupert Clever', 'Miss Jane Super']}
df = pd.DataFrame(data)

# 定义称谓集合(集合查找更快)
saluations = {'Mr', 'Mr.', 'Mrs', 'Mrs.', 'Miss', 'Ms', 'Ms.', 'Dr.', 'Lord', 'Lady'}

# 拆分姓名的函数
def split_name(name):
    parts = name.split()
    if parts[0] in saluations:
        title = parts[0]
        first_name = parts[1]
        last_name = parts[-1]
    else:
        title = ''
        first_name = parts[0]
        last_name = parts[-1]
    return pd.Series([title, first_name, last_name], index=['Title', 'First Name', 'Last Name'])

# 应用函数并合并结果
result = df.join(df['Names'].apply(split_name))

# 输出结果
print(result[['Title', 'First Name', 'Last Name']])

运行结果

Title First Name Last Name
0              Simon      Cool
1  Mrs.       Sarah     Smart
2    Mr       Harry     Adams
3             Rupert     Clever
4   Miss        Jane     Super

优化建议

  • 用集合存储称谓:集合的成员检查时间复杂度为O(1),列表为O(n),处理大数据集时效率差异明显。
  • 避免手动循环:Pandas的apply(或向量化操作)是专为逐行处理优化的,比手动构建列表更简洁高效。
  • 兼容边缘情况:如果需要处理带中间名或多称谓的姓名,可以扩展函数逻辑,比如检查更长的前缀或调整字段提取规则(当前代码适用于你的示例场景)。

内容的提问来源于stack exchange,提问作者S.Toor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 05:24:29