str.normalize ничего не делать в пандах - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть файл данных pandas, загруженный из CSV, с одним столбцом, который закодировал символы Юникода, такие как \u00ca.метод str.normalize() должен позаботиться об этом, но он не работает, даже когда он работает с unicodedata.normalize

import unicodedata
s = 'BC - CPE LE H\u00caTRE INC.'
unicodedata.normalize('NFKD', s)
>> 'BC - CPE LE HÊTRE INC.'

Но не тогда, когда он входит в серию панд.

import pandas as pd

names = ['BC - CPE LE H\u00caTRE INC.',
 'BC - CPE LE CHEZ-MOI DES PETITS',
 'BC GARDE MILIEU FAMILIAL DE BORDEAUX-CARTIERVILLE',
 'BC - BCGMF AHUNSTIC',
 'BC - CPE LE JARDIN DES R\u00caVES INC.',
 'BC - \FORCE VIVE\" CPE"',
 'BC - CPE GAMINVILLE INC.',
 'BC - CPE PIROUETTE DE FABREVILLE INC.',
 'B.C. ST-MICHEL',
 'BC - CPE DU PARC',
 'BC - CPE LA TROTTINETTE CAROTTEE',
 'BC - CPE DE MONTR\u00c9AL-NORD']

names = pd.Series(names)
names.str.normalize('NFKD')

>> 0                           BC - CPE LE H\u00caTRE INC.
  1                       BC - CPE LE CHEZ-MOI DES PETITS
  2     BC GARDE MILIEU FAMILIAL DE BORDEAUX-CARTIERVILLE
  3                                   BC - BCGMF AHUNSTIC
  4                BC - CPE LE JARDIN DES R\u00caVES INC.
  5                               BC - \FORCE VIVE\" CPE"
  6                              BC - CPE GAMINVILLE INC.
  7                 BC - CPE PIROUETTE DE FABREVILLE INC.
  8                                        B.C. ST-MICHEL
  9                                      BC - CPE DU PARC
  10                     BC - CPE LA TROTTINETTE CAROTTEE
  11                       BC - CPE DE MONTR\u00c9AL-NORD
  dtype: object

Я также пробовал все возможные варианты str.encode и str.decode до и после normalize.Ничего не изменилось.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Проблема заключалась в том, что пандам удалось избежать символа Юникод в строке.Таким образом, \u00ca был сохранен как \\u00ca.Чтобы декодировать его обратно, мне просто нужно это, на что @ user2357112 намекнул:

Series.str.decode('unicode-escape')

0 голосов
/ 28 ноября 2018

unicodedata.normalize не делает то, что вы думаете.unicodedata.normalize не обрабатывает \u escape-последовательности;он преобразует ввод в различные формы нормализации Unicode .

Обработка литералов строки Python - это то, что преобразует \u00ca в символ Ê, а обработка литералов строки Python не применяется ни к чему, кроме строки Pythonлитералы.На вход, который вы читаете из CSV-файла, не применяется обработка литералов строки Python.(Содержимое списка names в вашем вопросе действительно применяет обработку строкового литерала, поэтому ваш опубликованный код не может воспроизвести вашу ошибку. Вы действительно должны были проверить это перед публикацией.)

В зависимости от содержимогофайла и контекста вашего приложения, декодирование ввода с помощью кодировки unicode-escape с использованием codecs.decode может быть подходящим способом обработки экранированных символов \u.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...