如何从列中的值中去除重音符号?

40
如何将特殊字符更改为常规字母? 这是我的数据框:
In [56]: cities
Out[56]:

Table Code  Country         Year        City        Value       
240         Åland Islands   2014.0      MARIEHAMN   11437.0 1
240         Åland Islands   2010.0      MARIEHAMN   5829.5  1
240         Albania         2011.0      Durrës      113249.0
240         Albania         2011.0      TIRANA      418495.0
240         Albania         2011.0      Durrës      56511.0 

我希望它看起来像这样:
In [56]: cities
Out[56]:

Table Code  Country         Year        City        Value       
240         Aland Islands   2014.0      MARIEHAMN   11437.0 1
240         Aland Islands   2010.0      MARIEHAMN   5829.5  1
240         Albania         2011.0      Durres      113249.0
240         Albania         2011.0      TIRANA      418495.0
240         Albania         2011.0      Durres      56511.0 

相关问题?https://dev59.com/8HRB5IYBdhLWcg3wxZ7Y - tobias_k
6个回答

96

熊猫的方法是使用向量化的str.normalize结合str.decodestr.encode

In [60]:
df['Country'].str.normalize('NFKD').str.encode('ascii', errors='ignore').str.decode('utf-8')

Out[60]:
0    Aland Islands
1    Aland Islands
2          Albania
3          Albania
4          Albania
Name: Country, dtype: object

因此,要对所有 str 数据类型执行此操作:

In [64]:
cols = df.select_dtypes(include=[np.object]).columns
df[cols] = df[cols].apply(lambda x: x.str.normalize('NFKD').str.encode('ascii', errors='ignore').str.decode('utf-8'))
df

Out[64]:
   Table Code        Country    Year       City      Value
0         240  Aland Islands  2014.0  MARIEHAMN  11437.0 1
1         240  Aland Islands  2010.0  MARIEHAMN  5829.5  1
2         240        Albania  2011.0     Durres   113249.0
3         240        Albania  2011.0     TIRANA   418495.0
4         240        Albania  2011.0     Durres    56511.0

3
这应该是被选中的答案,解决问题的正确方法。 - Salomé

9
使用 pandas 系列示例。
def remove_accents(a):
    return unidecode.unidecode(a.decode('utf-8'))

df['column'] = df['column'].apply(remove_accents)

在这种情况下,对 ASCII 进行解码。

5

这是针对Python 2.7的。如果要转换为ASCII,您可以尝试以下方法:

import unicodedata

unicodedata.normalize('NFKD', u"Durrës Åland Islands").encode('ascii','ignore')
'Durres Aland Islands'

1
我希望删除所有列名称中的重音符号,因此我使用了
df.columns = df.columns.str.normalize('NFKD').str.encode('ascii',errors='ignore').str.decode('utf-8')

0
这是对不同方法的比较。这应该有助于根据使用情况选择方法。我个人倾向于使用unidecode,因为它既不保留非ASCII字符,也不删除它们。
from unidecode import unidecode
import unicodedata
import pandas as pd

def unicodedata_1(s):
    nfkd_form = unicodedata.normalize('NFKD', s)
    return ''.join([c for c in nfkd_form if not unicodedata.combining(c)])
def unicodedata_2(s):
    nfd_form = unicodedata.normalize('NFD', s)
    return ''.join(c for c in nfd_form if unicodedata.category(c) != 'Mn')


df = pd.DataFrame({'original': ['|ẞŁł|', '|ĄąčÖ|', '|_x-2|', '|©α|', '|值|']})

df['unidecode'] = df['original'].apply(unidecode)
df['str.normalize'] = df['original'].str.normalize('NFKD').str.encode('ascii', 'ignore').str.decode('utf-8')
df['unicodedata_1'] = df['original'].apply(unicodedata_1)
df['unicodedata_2'] = df['original'].apply(unicodedata_2)

print(df)
#   original unidecode str.normalize unicodedata_1 unicodedata_2
# 0    |ẞŁł|    |SsLl|            ||         |ẞŁł|         |ẞŁł|
# 1   |ĄąčÖ|    |AacO|        |AacO|        |AacO|        |AacO|
# 2   |_x-2|    |_x-2|        |_x-2|        |_x-2|        |_x-2|
# 3     |©α|    |(c)a|            ||          |©α|          |©α|
# 4      |值|    |Zhi |            ||           |值|           |值|

-10

使用此代码:

df['Country'] = df['Country'].str.replace(u"Å", "A")
df['City'] = df['City'].str.replace(u"ë", "e")

请点击这里!当然,您应该为每个特殊字符和每一列都这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接