如何用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
相关产品推荐
相关产品推荐

