Schreiben eines Pandas DataFrame in eine CSV-Datei

Ich habe einen Datenrahmen in Pandas, den ich in eine CSV-Datei schreiben möchte. Ich tue dies mit:

df.to_csv('out.csv')

Und erhalte den Fehler:

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

Gibt es eine Möglichkeit, dieses Problem einfach zu umgehen (d.h. ich habe Unicode-Zeichen in meinem Datenrahmen)? Und gibt es eine Möglichkeit, in eine tabulatorgetrennte Datei statt in eine CSV-Datei zu schreiben, z. B. mit einer 'to-tab' Methode (die es meiner Meinung nach nicht gibt)?

Lösung

Zur Abgrenzung durch einen Tabulator können Sie das Argument sep von to_csv verwenden:

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

Um eine bestimmte Kodierung (z.B. 'utf-8') zu verwenden, benutzen Sie das Argument encoding:

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

Wenn Sie Probleme mit der Kodierung in 'utf-8' haben und Zelle für Zelle gehen möchten, können Sie Folgendes versuchen.

Python 2

(Wobei "df" Ihr DataFrame-Objekt ist.)

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

Dann versuchen Sie es:

df.to_csv(file_name)

Sie können die Kodierung der Spalten überprüfen, indem Sie:

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

Achtung: errors='ignore' lässt das Zeichen einfach weg, z.B.

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
Kommentare (0)

Manchmal treten diese Probleme auf, wenn Sie auch die UTF-8-Kodierung angeben. Ich empfehle Ihnen, die Kodierung beim Lesen der Datei und die gleiche Kodierung beim Schreiben in die Datei anzugeben. Dies könnte Ihr Problem lösen.

Kommentare (0)