2014-05-11 9 views
11

Czytam plik Excela, który ma kilka danych liczbowych i kategorycznych. Kolumny nazwa_strumienia zawierają znaki w obcym języku. Kiedy próbuję zobaczyć zawartość kolumny name_string, otrzymuję żądane wyniki, ale cudzoziemskie znaki (które są wyświetlane poprawnie w arkuszu kalkulacyjnym programu Excel) są wyświetlane z niewłaściwym kodowaniem. Oto co mam:Pandas, frameworka danych i kodowanie znaków podczas odczytu pliku excel

import pandas as pd 
df = pd.read_excel('MC_simulation.xlsx', 'DataSet', encoding='utf-8') 
name_string = df.name_string.unique() 
name_string.sort() 
name_string 

produkującym następujące:

array([u'4th of July', u'911', u'Abab', u'Abass', u'Abcar', u'Abced', 
     u'Ceded', u'Cedes', u'Cedfus', u'Ceding', u'Cedtim', u'Cedtol', 
     u'Cedxer', u'Chevrolet Corvette', u'Chuck Norris', 
     u'Cristina Fern\xe1ndez de Kirchner'], dtype=object) 

W ostatniej linii, poprawnie zakodowany nazwa powinna być Cristina Fernández de Kirchner. Czy ktoś może mi pomóc w tym problemie?

Odpowiedz

9

W rzeczywistości dane są przetwarzane poprawnie w unicode, a nie strs. Prefiks u wskazuje, że obiektami są unicode. Kiedy drukowana jest lista, krotka lub tablica NumPy, Python pokazuje repr elementów w sekwencji. Więc zamiast widząc drukowaną wersję unicode, widać repr:

In [160]: repr(u'Cristina Fern\xe1ndez de Kirchner') 
Out[160]: "u'Cristina Fern\\xe1ndez de Kirchner'" 

In [156]: print(u'Cristina Fern\xe1ndez de Kirchner') 
Cristina Fernández de Kirchner 

The purpose of the repr jest zapewnienie jednoznacznej reprezentacji ciąg dla każdego obiektu. Wydrukowana wersja unikodu może być niejednoznaczna z powodu niewidocznych lub niedrukowalnych znaków.

Jeśli wydrukować DataFrame lub serii, jednak otrzymasz drukowaną wersję Unicode:

In [157]: df = pd.DataFrame({'foo':np.array([u'4th of July', u'911', u'Abab', u'Abass', u'Abcar', u'Abced', 
     u'Ceded', u'Cedes', u'Cedfus', u'Ceding', u'Cedtim', u'Cedtol', 
     u'Cedxer', u'Chevrolet Corvette', u'Chuck Norris', 
     u'Cristina Fern\xe1ndez de Kirchner'], dtype=object)}) 
    .....: .....: .....: 
In [158]: df 
Out[158]: 
           foo 
0      4th of July 
1        911 
2        Abab 
3       Abass 
4       Abcar 
5       Abced 
6       Ceded 
7       Cedes 
8       Cedfus 
9       Ceding 
10       Cedtim 
11       Cedtol 
12       Cedxer 
13    Chevrolet Corvette 
14     Chuck Norris 
15 Cristina Fernández de Kirchner 

[16 rows x 1 columns] 
+0

Dziękuję bardzo @unutbu. Znakomita odpowiedź i dla mnie wyjaśniono więcej niż jedną rozmytą kwestię. Pozdrowienia –

+0

Jak zapisać ten sam problem, gdy zapisujemy wartości na liście i musimy wydrukować listę. Chciałbym zobaczyć właściwe znaki. – Sigur

+0

@Sigur: Drukowanie listy powoduje, że Python wydrukuje nawiasy kwadratowe wokół * repr * pozycji na liście oddzielonych przecinkami. Jeśli chcesz "str" ​​elementów, musisz [skomponować to sam] (https://stackoverflow.com/a/32849250/190597). Konieczne może być również dekodowanie bajtów, jeśli obiekty na liście to 'bytes', a nie (Python3)' str's. Jeśli to wyjaśnienie i link nie odpowiadają w pełni na twoje pytanie, otwórz nowe pytanie ze wszystkimi szczegółami (przykładowy fragment listy i pożądany wynik). – unutbu