Как заменить акценты в столбце pandas dataframe - PullRequest
0 голосов
/ 09 мая 2018

У меня есть датафрейм 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")

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Это один из способов. Вы можете сначала преобразовать в байтовый литерал перед декодированием в 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. Согласно документам :

Нормальная форма KD (NFKD) будет применять разложение совместимости, т.е. заменить все символы совместимости их эквивалентами.

0 голосов
/ 09 мая 2018

Попробуйте unidecode module.

Пример:

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)

Примечание: Функция из этой ссылки

Обновление согласно комментарию

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