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

