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

如何清洗Pandas DataFrame姓名列 提取有效名字并处理异常值

Pandas 姓名列清洗实现方案

核心清洗规则:按空格拆分姓名后,首个拆分项不含逗号则取首个项,含逗号则取第二个项,无对应有效项时返回NaN。


方法1:自定义函数实现(易读性高,适合小数据量)

import pandas as pd
import numpy as np

# 生成示例数据
names = {'Name': ['Robert Marin','Katherine Ortiz', 'Sloth, Herbert','Perez,']}
df = pd.DataFrame(names)

# 自定义清洗函数
def clean_name(name_str):
    parts = name_str.strip().split()
    # 无有效拆分结果直接返回空值
    if not parts:
        return pd.NA
    # 首个元素不含逗号,直接取第一个项
    if ',' not in parts[0]:
        return parts[0]
    # 首个元素含逗号,取第二个项,无第二个项则返回空值
    return parts[1] if len(parts)>=2 else pd.NA

# 应用函数到姓名列
df['Name'] = df['Name'].apply(clean_name)

运行后输出结果:

Name
0     Robert
1  Katherine
2    Herbert
3       <NA>

方法2:矢量化Str操作(性能更高,适合百万级以上数据)

无需自定义函数和循环,直接用Pandas内置字符串方法实现,执行效率远高于apply:

import pandas as pd
import numpy as np

names = {'Name': ['Robert Marin','Katherine Ortiz', 'Sloth, Herbert','Perez,']}
df = pd.DataFrame(names)

# 按空格拆分姓名为列表
name_parts = df['Name'].str.split()
# 生成掩码:判断首个拆分项是否包含逗号
mask = name_parts.str[0].str.contains(',', na=False)
# 按条件取值,索引不存在时会自动返回NaN
df['Name'] = np.where(mask, name_parts.str[1], name_parts.str[0])

原代码问题说明

  • 自定义函数逻辑错误:对拆分后的列表遍历判断单个字符,不符合需求判断逻辑
  • apply调用方式错误:df.apply(firstNameMod(df['Name']))是先执行函数传入整列,再把返回值传给apply,正确写法是df['Name'].apply(函数名),仅传入函数名,由apply逐个传入元素调用
  • 没有对列表索引长度做校验,遇到逗号后无内容的情况会触发索引越界错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:15:08