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

