Как заменить шведские символы ä, å, ö в именах столбцов в python? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть датафрейм с именами некоторых столбцов, имеющих шведские символы (ö, ä, å).Я хотел бы заменить эти символы на простые o, a, a.

Я пытался преобразовать имена столбцов в str и заменить символы, это работает, но потом становится сложнее, если я хочу присвоить str в качестве имен столбцов, то есть требуется несколько операций, которые усложняют его.

Я попробовал следующий код, который заменяет шведские символы в именах столбцов на английские алфавиты и возвращает результат как str.

from unidecode import unidecode
unicodedata.normalize('NFKD',str(df.columns).decode('utf-8')).encode('ascii', 'ignore')

Есть ли способ использовать возвращаемую строку в качестве имени столбца для кадра данных?Если нет, то есть ли лучший способ заменить шведские символы в именах столбцов?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Для меня работает сначала нормализация, затем кодирование в ascii и последнее декодирование в utf-8:

df = pd.DataFrame(columns=['aä','åa','oö'])

df.columns = (df.columns.str.normalize('NFKD')
                        .str.encode('ascii', errors='ignore')
                        .to_series()
                        .str.decode('utf-8'))
print (df)
Empty DataFrame
Columns: [aa, aa, oo]
Index: []

Другие решения с map или списком:

import unicodedata

f = lambda x: unicodedata.normalize('NFKD', x).encode('ascii', 'ignore').decode('utf-8')
df.columns = df.columns.map(f)
print (df)
Empty DataFrame
Columns: [aa, aa, oo]
Index: []

import unicodedata

df.columns = [unicodedata.normalize('NFKD', x).encode('ascii', 'ignore').decode('utf-8') 
                     for x in df.columns]
print (df)
Empty DataFrame
Columns: [aa, aa, oo]
Index: []
0 голосов
/ 19 февраля 2019

Это может быть много ручной работы, когда у вас много столбцов, но один из способов сделать это - использовать str.replace, например:

    bänk  röund
0   1     3
1   2     4
2   3     5

df.columns = df.columns.str.replace('ä', 'a')
df.columns = df.columns.str.replace('ö', 'o')


    bank  round
0   1     3
1   2     4
2   3     5
...