Неизвестное значение продолжает включаться в уникальный вектор - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь извлечь список уникальных значений из фрейма данных, но продолжаю получать значение, которое не могу найти нигде в исходном фрейме данных.Кто-нибудь сталкивался с чем-то подобным?

Я прочитал в текстовом файле:

tmpPandaObj = pd.read_csv(fn, sep='\t', header=None)   
tmpPandaObj.columns = ['stockId','dt','hhmm','seq','ecalls']

Вытащить уникальные значения:

uniqueStockIdVec = tmpPandaObj.stockId.unique()

И все же я продолжаю получать'\ ufeff19049' включен в уникальный вектор.Я искал текстовые файлы и фрейм данных так сильно, как только мог, но без удачи нашел какое-либо значение '\ ufeff19049'.Единственными уникальными значениями должны быть «19049», «24937», «139677».

Ответы [ 2 ]

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

Во-первых, исправление: укажите encoding='UTF-8-sig' при чтении файла.

Теперь объяснение:

\ufeff - символ Unicode BOM (метка порядка байтов) . Всякий раз, когда один инструмент записывает файл с спецификацией, а другой инструмент читает файл, используя явную кодировку, такую ​​как UTF-16-LE вместо версии с переключением спецификации, такой как UTF-16, спецификация обрабатывается как обычный символ, поэтому \ufeff показывает в вашей строке. Вне Microsoft-land эта конкретная проблема (читается как UTF-16 как UTF-16-LE) на сегодняшний день является наиболее распространенной версией этой проблемы.

Но если один из инструментов от Microsoft, это чаще всего UTF-8. Стандарт Unicode рекомендует никогда не использовать спецификацию с UTF-8 (поскольку байты не нуждаются в метке порядка байтов), но не совсем запрещает это, поэтому многие инструменты Microsoft продолжают это делать. И затем любой другой инструмент, включая Python (и Pandas), просто читает его как UTF-8 без спецификации, в результате чего появляется дополнительный \ufeff. (Старые, не поддерживающие Юникод инструменты будут читать те же три байта \xef\xbb\xbf, что и что-то вроде , что вы, возможно, видели несколько раз.)

Но хотя Python (и Pandas) по умолчанию равен UTF-8, он позволяет вам указать кодировку вручную, и одна из кодировок, с которой он поставляется, называется UTF-8-sig, что означает UTF-8 с бесполезной спецификацией в начале.

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

То, что вы делаете, хорошо, но выглядит как ссылка u '\ ufeff' в строке Python . Это \ufeff похоже на призрачный символ , который панды опускают, поэтому вы не можете найти это значение.

Если это проблема для вас, вы можете попробовать очистить все данные в столбце с помощью функции .encode(...) или попытаться преобразовать каждую строку в int или что вам нужно.

...