SQL零售数据库姓名数据清洗求助:特殊字符与乱码姓名处理
姓名数据清洗解决方案
1. 修复乱码问题
你看到的ü、ä这类字符是编码错误导致的:原本的UTF-8特殊字符(比如德语的ü、ä)被错误用Latin-1(ISO-8859-1)解码了。可以通过反向编码解码修复:
# 修复first_name的编码问题 user_dataframe['first_name'] = user_dataframe['first_name'].str.encode('latin-1').str.decode('utf-8') # 修复last_name同理 user_dataframe['last_name'] = user_dataframe['last_name'].str.encode('latin-1').str.decode('utf-8')
修复后,Hans Jürgen会变成正确的Hans Jürgen,Bärbel变成Bärbel。
2. 筛选无效姓名数据
针对字母数字混合的垃圾数据(比如2GU3G97VI1、DD0K0FUDRY),可以用正则表达式匹配合法姓名的特征:
- 包含大小写字母、变音符号(ü/ä/ö等)
- 允许空格(比如双名)、连字符(比如
Klaus-Jürgen) - 不包含数字、特殊符号(除了空格和连字符)
步骤:
- 定义匹配合法姓名的正则表达式:
import re # 匹配包含字母、变音符号、空格、连字符的姓名,至少1个有效字符 valid_name_pattern = re.compile(r'^[a-zA-ZÀ-ÿ\s-]+$')
(À-ÿ覆盖了大部分欧洲语言的变音字符,适合零售数据库的姓名场景)
- 筛选出符合规则的行:
# 同时校验first_name和last_name的合法性 user_dataframe = user_dataframe[ user_dataframe['first_name'].apply(lambda x: valid_name_pattern.match(x) is not None) & user_dataframe['last_name'].apply(lambda x: valid_name_pattern.match(x) is not None) ]
- (快速替代方案)如果只需过滤含数字的垃圾数据,可直接用:
# 删除first_name或last_name中包含数字的行 user_dataframe = user_dataframe[~user_dataframe['first_name'].str.contains(r'[0-9]')] user_dataframe = user_dataframe[~user_dataframe['last_name'].str.contains(r'[0-9]')]
完整流程示例
import pandas as pd import re # 1. 修复编码错误 user_dataframe['first_name'] = user_dataframe['first_name'].str.encode('latin-1').str.decode('utf-8') user_dataframe['last_name'] = user_dataframe['last_name'].str.encode('latin-1').str.decode('utf-8') # 2. 筛选合法姓名 valid_name_pattern = re.compile(r'^[a-zA-ZÀ-ÿ\s-]+$') user_dataframe = user_dataframe[ user_dataframe['first_name'].apply(lambda x: valid_name_pattern.match(x) is not None) & user_dataframe['last_name'].apply(lambda x: valid_name_pattern.match(x) is not None) ]
内容的提问来源于stack exchange,提问作者Darman
相关产品推荐
相关产品推荐

