【问题标题】:How to replace accents in a column of a pandas dataframe如何替换熊猫数据框列中的重音符号
【发布时间】:2018-05-09 12:44:16
【问题描述】:

我有一个数据框dataSwiss,其中包含瑞士市政当局的信息。我想用普通字母替换重音字母。

这就是我正在做的:

dataSwiss['Municipality'] = dataSwiss['Municipality'].str.encode('utf-8')
dataSwiss['Municipality'] = dataSwiss['Municipality'].str.replace(u"é", "e")

但我收到以下错误:

----> 2 dataSwiss['Municipality'] = dataSwiss['Municipality'].str.replace(u"é", "e")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

数据如下:

dataSwiss.Municipality
0               Zürich
1               Zürich
2               Zürich
3               Zürich
4               Zürich
5               Zürich
6               Zürich
7               Zürich

我找到了解决办法

s = dataSwiss['Municipality']
res = s.str.decode('utf-8')
res = res.str.replace(u"é", "e")

【问题讨论】:

    标签: python string pandas unicode decode


    【解决方案1】:

    这是一种方式。您可以先转换为字节文字,然后再解码为 utf-8。

    s = pd.Series(['hello', 'héllo', 'Zürich', 'Zurich'])
    
    res = s.str.normalize('NFKD')\
           .str.encode('ascii', errors='ignore')\
           .str.decode('utf-8')
    
    print(res)
    
    0     hello
    1     hello
    2    Zurich
    3    Zurich
    dtype: object
    

    pd.Series.str.normalize 使用 unicodedata 模块。根据docs

    范式 KD (NFKD) 将应用兼容性分解, 即用它们的等价物替换所有兼容性字符。

    【讨论】:

    • 我得到的不是Zurich,而是ZA14rich
    • @emax,这很奇怪,你是在复制/粘贴我的代码吗?我在 Pandas 0.19.2 / Python 3.6 上供参考。你在用什么?
    【解决方案2】:

    试试 unidecode 模块。

    例如:

    import unidecode
    dataSwiss['Municipality'] = dataSwiss['Municipality'].apply(unidecode.unidecode)
    

    或者:

    import unicodedata
    def remove_accents(input_str):
        nfkd_form = unicodedata.normalize('NFKD', input_str)
        only_ascii = nfkd_form.encode('ASCII', 'ignore')
        return only_ascii
    
    dataSwiss['Municipality'] = dataSwiss['Municipality'].apply(remove_accents)
    

    注意:函数来自这个link

    根据评论更新

    dataSwiss['Municipality'] = dataSwiss['Municipality'].apply(unicode).apply(remove_accents)
    

    【讨论】:

    • 现在我收到此错误----> 3 nfkd_form = unicodedata.normalize('NFKD', input_str) TypeError: normalize() argument 2 must be unicode, not str
    • @还是一样,不明白为什么
    • 您可以发布您的数据样本吗?
    • 我发布了一个数据样本
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2021-12-29
    • 2018-05-03
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多