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

df.to_csv('out.csv')

Und den Fehler bekommen:

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

Gibt es eine Möglichkeit, dies einfach zu umgehen (d. H. Ich habe Unicode-Zeichen in meinem Datenrahmen)? Und gibt es eine Möglichkeit, in eine durch Tabulatoren getrennte Datei anstelle einer CSV zu schreiben, indem z. eine 'to-tab'-Methode (von der ich nicht glaube, dass sie existiert)?

893
user7289 4 Juni 2013 im 20:46

7 Antworten

Beste Antwort

Zum Abgrenzen durch eine Registerkarte können Sie das Argument sep von {{ X1}}:

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

Verwenden Sie das Argument encoding, um eine bestimmte Codierung (z. B. 'utf-8') zu verwenden:

df.to_csv(file_name, sep='\t', encoding='utf-8')
979
Andy Hayden 4 Juni 2013 im 16:52

Um einen Pandas-DataFrame in eine CSV-Datei zu schreiben, benötigen Sie DataFrame.to_csv . Diese Funktion bietet viele Argumente mit angemessenen Standardeinstellungen, die Sie häufig überschreiben müssen, um sie an Ihren spezifischen Anwendungsfall anzupassen. Beispielsweise möchten Sie möglicherweise ein anderes Trennzeichen verwenden, das Datum / Uhrzeit-Format ändern oder den Index beim Schreiben löschen. to_csv enthält Argumente, die Sie übergeben können, um diese Anforderungen zu erfüllen.

In der folgenden Tabelle sind einige gängige Szenarien für das Schreiben in CSV-Dateien und die entsprechenden Argumente aufgeführt, die Sie für diese verwenden können.

Write to CSV ma dude

Fußnoten

  1. Das Standardtrennzeichen wird als Komma (',') angenommen. Ändern Sie dies nur, wenn Sie wissen, dass Sie es müssen.
  2. Standardmäßig wird der Index von df als erste Spalte geschrieben. Wenn Ihr DataFrame keinen Index hat (IOW, df.index ist die Standardeinstellung RangeIndex), sollten Sie beim Schreiben index=False festlegen. Um dies anders zu erklären: Wenn Ihre Daten einen Index haben, können (und sollten) Sie index=True verwenden oder ihn einfach ganz weglassen (standardmäßig True).
  3. Es ist ratsam, diesen Parameter festzulegen, wenn Sie Zeichenfolgendaten schreiben, damit andere Anwendungen wissen, wie Ihre Daten gelesen werden. Dadurch werden auch mögliche UnicodeEncodeError vermieden, die beim Speichern auftreten können.
  4. Die Komprimierung wird empfohlen, wenn Sie große DataFrames (> 100.000 Zeilen) auf die Festplatte schreiben, da dies zu viel kleineren Ausgabedateien führt. OTOH, dies bedeutet, dass sich die Schreibzeit erhöht (und folglich die Lesezeit, da die Datei dekomprimiert werden muss).
12
cs95 28 Mai 2019 im 04:07

Wenn Sie ein DataFrame Objekt mit der to_csv -Methode in einer CSV-Datei speichern, müssen Sie wahrscheinlich nicht die vorhergehenden Indizes jedes Objekts speichern Zeile des DataFrame Objekts.

Sie können dies vermeiden , indem Sie einen booleschen Wert False an den Parameter index übergeben.

Etwas wie:

df.to_csv(file_name, encoding='utf-8', index=False)

Wenn Ihr DataFrame-Objekt ungefähr so aussieht:

  Color  Number
0   red     22
1  blue     10

In der CSV-Datei wird Folgendes gespeichert:

Color,Number
red,22
blue,10

Anstelle von (der Fall, in dem der Standardwert True übergeben wurde)

,Color,Number
0,red,22
1,blue,10
232
cs95 7 Apr. 2019 im 22:10

Etwas anderes können Sie versuchen, wenn Sie Probleme beim Codieren in 'utf-8' haben und Zelle für Zelle gehen möchten. Sie können 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 versuche es:

df.to_csv(file_name)

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

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

Warnung: error = 'ignore' lässt nur das Zeichen weg, z.

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
17
Glen Thompson 1 Dez. 2017 im 17:38

Es könnte nicht die Antwort für diesen Fall sein, aber da ich die gleiche Fehlermeldung mit .to_csv hatte, habe ich .toCSV('name.csv') ausprobiert und die Fehlermeldung war anders ("SparseDataFrame' object has no attribute 'toCSV') Das Problem wurde gelöst, indem der Datenrahmen in einen dichten Datenrahmen umgewandelt wurde

df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')
5
nucsit026 19 Jän. 2020 im 19:42

Beispiel für den Export in eine Datei mit vollständigem Pfad unter Windows und für den Fall, dass Ihre Datei Header enthält:

df.to_csv (r'C:\Users\John\Desktop\export_dataframe.csv', index = None, header=True) 

Beispiel, wenn Sie in einem Ordner in demselben Verzeichnis speichern möchten, in dem sich Ihr Skript befindet, mit utf-8-Codierung und Registerkarte als Trennzeichen :

df.to_csv(r'./export/dftocsv.csv', sep='\t', encoding='utf-8', header='true')
5
Harvey 28 Nov. 2019 im 15:28

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

10
Tadhg McDonald-Jensen 19 Mai 2016 im 13:15