Zapisywanie pandas DataFrame do pliku CSV

Mam ramkę danych w pandas, którą chciałbym zapisać do pliku CSV. Robię to za pomocą:

df.to_csv('out.csv')

I dostaję błąd:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)

Czy jest jakiś sposób, aby obejść to w prosty sposób (tj. Mam znaki unicode w mojej ramce danych)? I czy istnieje sposób, aby zapisać do pliku z tabulacją zamiast do CSV, używając np. metody 'to-tab' (która chyba nie istnieje)?

Rozwiązanie

Aby oddzielić tabulatorami możesz użyć argumentu sep z to_csv:

df.to_csv(file_name, sep='\t')

Aby użyć określonego kodowania (np. 'utf-8') użyj argumentu encoding:

df.to_csv(file_name, sep='\t', encoding='utf-8')
Komentarze (1)

Coś innego można spróbować, jeśli masz problemy z kodowaniem do 'utf-8' i chcesz iść komórka po komórce można spróbować następujące.

Python 2

(Gdzie "df" jest twoim obiektem DataFrame).

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx,column)
        try:
            x = unicode(x.encode('utf-8','ignore'),errors ='ignore') if type(x) == unicode else unicode(str(x),errors='ignore')
            df.set_value(idx,column,x)
        except Exception:
            print 'encoding error: {0} {1}'.format(idx,column)
            df.set_value(idx,column,'')
            continue

Następnie spróbuj:

df.to_csv(file_name)

Możesz sprawdzić kodowanie kolumn przez:

for column in df.columns:
    print '{0} {1}'.format(str(type(df[column][0])),str(column))

Ostrzeżenie: errors='ignore' spowoduje tylko pominięcie znaku np.

IN: unicode('Regenexx\xae',errors='ignore')
OUT: u'Regenexx'

Python 3

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx,column)
        try:
            x = x if type(x) == str else str(x).encode('utf-8','ignore').decode('utf-8','ignore')
            df.set_value(idx,column,x)
        except Exception:
            print('encoding error: {0} {1}'.format(idx,column))
            df.set_value(idx,column,'')
            continue
Komentarze (0)

Czasami napotykasz te problemy, jeśli określisz kodowanie UTF-8 również. Zalecam określenie kodowania podczas odczytu pliku i tego samego kodowania podczas zapisu do pliku. To może rozwiązać twój problem.

Komentarze (0)