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

Python清洗CSV姓名格式:姓,名转名姓格式报错求助

统一Pandas中姓名格式的解决方案

问题场景

处理CSV数据集时,姓名列存在两种格式:

  • 格式1:名 姓(如John Cena)
  • 格式2:姓, 名(如Doe, John)

需要将所有姓名统一转换为名 姓的格式(无逗号,去除多余空格)。

示例输入

Doe, John  
Smith, John 
Snow, John
John Cena 
Steve Smith 

期望输出

John Doe 
John Smith 
John Snow
John Cena 
Steve Smith

遇到的错误

尝试直接对Series调用字符串方法,代码如下:

if ',' in df['names']:
    df['names'] = ' '.join(df['names'].split(',')[::-1]).strip()

抛出错误:

AttributeError: 'Series' object has no attribute 'split'

尝试将列转为列表df['name'] = df['name'].to_list()后,问题仍未解决。

错误原因

df['names']是Pandas的Series对象,而split()是单个字符串的方法,无法直接在Series上调用。转列表只是把Series转换成字符串列表,但没有实现逐个元素的格式处理逻辑。

解决方法

方法1:使用apply()遍历处理每个元素

定义格式化函数,通过apply()对每个姓名单独处理:

def normalize_name(name):
    if ',' in name:
        # 拆分姓和名,去除空格后重新拼接
        last_name, first_name = name.split(',', 1)
        return f"{first_name.strip()} {last_name.strip()}"
    else:
        # 已符合格式,仅去除多余空格
        return name.strip()

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

方法2:使用Pandas字符串方法批量处理(更高效)

利用Pandas内置的str系列方法批量处理带逗号的行,再统一去除空格:

# 筛选出带逗号的行,拆分后反转拼接
comma_mask = df['names'].str.contains(',')
df.loc[comma_mask, 'names'] = df.loc[comma_mask, 'names'].str.split(',', 1).apply(
    lambda x: f"{x[1].strip()} {x[0].strip()}"
)
# 统一去除所有姓名的多余空格
df['names'] = df['names'].str.strip()

方法3:一行式简洁写法

用lambda函数结合列表推导式,在apply()中完成逻辑:

df['names'] = df['names'].apply(
    lambda x: ' '.join(reversed([s.strip() for s in x.split(',')])) if ',' in x else x.strip()
)

以上三种方法都能实现姓名格式的统一转换,处理示例输入后即可得到期望的输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:41:05