【发布时间】:2020-08-24 02:17:43
【问题描述】:
以下是我的 DF 示例
ROLE NAME
GESELLSCHAFTER DUPONT DUPONT
GESCHäFTSFüHRER DUPONT DUPONT
KOMPLEMENTäR DUPONT DUPONT
GESELLSCHAFTER DUPONT DUPONT
KOMPLEMENTäR DUPONT DUPONT
目的是修复特殊字符。
例如,'KOMPLEMENTäR'--> 应该是 'KOMPLEMENTAR'(有或没有口音并不重要)
因此,我尝试构造一个列表并将值名称替换为下面的 dic 列表。
{'A¤':'A', 'A–':'A', 'A¶':'A', 'A€':'A', 'Aƒ':'A', 'A„':'A', 'A\…':'A', 'A¡':'A',
'A¢':'A', 'A£':'A', 'A¥':'A', 'A¦':'A',
'A©':'E', 'Aˆ':'E', 'A‰':'E', 'AŠ':'E', 'A‹':'E',
'AŒ':'I', 'AŽ':'I', 'A¬':'I', 'A':'I', 'A®':'I', 'A¯':'I',
'A“':'O', 'A”':'O', 'A•':'O', 'A–':'O', 'A°':'O', 'A²':'O', 'A³':'O', 'A´':'O', 'Aµ':'O', 'A¶':'O',
'A¼':'U', 'A™':'U', 'Aš':'U', 'Aœ':'U', 'A¹':'U', 'Aº':'U', 'A»':'U', 'ÿ':'U'}
for key, value in dic.items():
df['ROLE'] = df['ROLE'].str.replace(key, value)
但是,我想知道是否有更好的方法来使用正则表达式来处理这个问题?
以下是打印时找到的解决方案。
nfd_example = 'KOMPLEMENTäR'
print(nfd_example.encode('cp1252').decode('utf-8-sig'))
output
KOMPLEMENTäR
此外,当我在 Pandas 列上尝试相同的代码时,输出错误如下:
df['ROLE_decode'] = df['ROLE'].str.encode('cp1252').str.decode('utf-8-sig')
'utf-8' codec can't decode byte 0xc4 in position 6: invalid continuation byte
编辑
下面是角色列的唯一值列表
AKTIONäR 133
AKTIONÄR 11
AUFSICHTSRAT 450
AUSüBENDE PERSON 688
AUSÜBENDE PERSON 131
DEFAULT KEY 62
GESCHäFTSFüHRENDER DIREKTOR 2
GESCHäFTSFüHRER 9555
当使用下面的代码时
df['ROLE_decode'] = df['ROLE'].str.encode('cp1252').str.decode('utf-8-sig', 'ignore').apply(unidecode)
它给了我以下独特的价值
AKTIONR 11
AKTIONaR 133
AUFSICHTSRAT 450
AUSBENDE PERSON 131
AUSuBENDE PERSON 688
DEFAULT KEY 62
GESCHFTSFHRER 797
GESCHaFTSFuHRENDER DIREKTOR 2
GESCHaFTSFuHRER 9555
所以,如果有人有想法,谢谢你的帮助!
【问题讨论】:
-
这些损坏的数据最初是如何进入数据框的?有可能在那个阶段修复它吗?
-
@Ture Pålsson 数据是从 XML 文档中提取的。因此,我收到了示例中所示的 csv 文件
-
我坚信这类问题最好在尽可能靠近源头的地方解决。如果 CSV 文件的编码损坏,那么我会尝试让提供 CSV 文件的人来修复它。诚然,这有时是不可能的,通常是出于政治原因。