读取CSV时处理编码与字符标准化,实现DataFrame按name列合并
解决CSV姓名编码不一致及转纯英文字母的方案
一、读取CSV时统一姓名编码
针对你遇到的编码混乱问题,核心是找到文件的实际编码并正确读取,或者对已读入的乱码字符串进行反向修复:
- 指定正确编码读取:
你提到csv1中的Ĺ arĹ«nas MarÄŤiulionis是Šarūnas Marčiulionis的错误解码结果,这通常是文件本身为UTF-8编码,但被用Windows-1252(或ISO-8859-1)解码导致的。读取csv1时直接指定UTF-8编码:
对于csv2的乱码(读取后为df1 = pd.read_csv('csv1.csv', encoding='utf-8')\x8aar?nas Marèiulionis),可尝试用latin-1编码读取,它能兼容更多单字节编码:df2 = pd.read_csv('csv2.csv', encoding='latin-1') - 修复已读入的乱码:
如果已经用错误编码读入数据,可通过编码转换还原:# 修复df1中的乱码(Windows-1252错误解码UTF-8的情况) df1['name'] = df1['name'].str.encode('windows-1252').str.decode('utf-8')
二、将姓名转换为仅含英文字母的形式
有两种可靠方法实现这个需求:
- 使用Unidecode库(推荐):
这个库专门用于将Unicode字符转换为ASCII字符,能处理绝大多数姓名中的重音和特殊字符。先安装库:
然后处理姓名列:pip install unidecode
处理后from unidecode import unidecode df1['name_clean'] = df1['name'].apply(unidecode) df2['name_clean'] = df2['name'].apply(unidecode)Šarūnas Marčiulionis会变成Sarunas Marciulionis,完全由英文字母组成。 - 使用Python标准库unicodedata:
无需额外安装,通过分解Unicode字符并移除重音标记来实现:
这种方法能处理大部分常见重音,但对一些特殊字符的转换精准度不如Unidecode。import unicodedata def normalize_name(text): # NFD分解字符,移除非间距标记(重音) return ''.join(c for c in unicodedata.normalize('NFD', text) if unicodedata.category(c) != 'Mn') df1['name_clean'] = df1['name'].apply(normalize_name) df2['name_clean'] = df2['name'].apply(normalize_name)
最后,你可以用name_clean列来合并两个DataFrame,确保匹配一致。
内容的提问来源于stack exchange,提问作者loookazs
相关产品推荐
相关产品推荐

