【问题标题】:Decode Characters Pandas解码字符熊猫
【发布时间】: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 文件的人来修复它。诚然,这有时是不可能的,通常是出于政治原因。

标签: python regex pandas


【解决方案1】:

您可以将regex=True 传递给replace

# the included dic seems to have `A` instead of 'Ã'
dic ={'ü':'U', 'ä':'A'}

df['ROLE'] = df['ROLE'].replace(dic, regex=True)

输出:

              ROLE           NAME
0   GESELLSCHAFTER  DUPONT DUPONT
1  GESCHAFTSFUHRER  DUPONT DUPONT
2     KOMPLEMENTAR  DUPONT DUPONT
3   GESELLSCHAFTER  DUPONT DUPONT
4     KOMPLEMENTAR  DUPONT DUPONT

【讨论】:

  • 感谢您的反馈。但是,如前所述,我想使用更“清洁”的解决方案。否则,我将不得不检查所有特殊字符并手动替换它们
【解决方案2】:

此解决方案相当长,可能不适用于大型数据集,首先使用unicodedata 进行分解,然后编码为ascii 以去除重音并解码为utf-8

from unicodedata import normalize
df.ROLE.apply(lambda x: normalize('NFD', x).encode(
    'ascii', 'ignore').decode('utf-8-sig'))

# 0                       AKTIONAR
# 1                       AKTIONAR
# 2                   AUFSICHTSRAT
# 3               AUSABENDE PERSON
# 4               AUSUBENDE PERSON
# 5                    DEFAULT KEY
# 6    GESCHAFTSFAHRENDER DIREKTOR
# 7                GESCHAFTSFAHRER
# Name: ROLE, dtype: object

【讨论】:

  • 感谢您的解决方案。我已经用你的评论编辑了这个问题
  • 您还在寻找不同的解决方案吗?
  • 它不应该给出 AKTIONR 和 AKTIONaR,因为它们是相似的。使用提供的代码,它会跳过字母 A(因为它可能有重音?)
猜你喜欢
  • 1970-01-01
  • 2018-04-23
  • 2014-02-20
  • 2018-04-18
  • 1970-01-01
  • 2019-07-30
  • 2018-10-31
  • 2021-12-14
  • 2014-04-05
相关资源
最近更新 更多