Pandas DataFrame in CSV: Komplettanleitung zu to_csv()
Updated on
Sie haben die Daten bereinigt, jede Spalte transformiert und Ihre Analyse durchgeführt. Jetzt müssen Sie die Ergebnisse teilen -- und die CSV-Datei, die Sie exportieren, öffnet sich mit verstümmelten Zeichen in Excel, einer unerwünschten Index-Spalte oder einer 4 GB großen Datei, die den Laptop Ihres Kollegen zum Absturz bringt. Einen Pandas DataFrame in CSV zu exportieren klingt einfach, bis Kodierung, Trennzeichen, Komprimierung und Performance bei großen Dateien einen Einzeiler in eine Debugging-Sitzung verwandeln.
Diese Probleme sind häufig, weil to_csv() über 20 Parameter hat und die Standardwerte nicht immer dem entsprechen, was nachgelagerte Verbraucher erwarten. Eine falsche Kodierung zerstört Nicht-ASCII-Text. Ein fehlendes index=False fügt eine mysteriöse Spalte hinzu. Keine Komprimierung verwandelt einen vernünftigen Datensatz in einen übergroßen Dateianhang.
Die Methode DataFrame.to_csv() bewältigt all diese Fälle, sobald Sie wissen, welche Parameter Sie setzen müssen. Diese Anleitung führt Sie durch jedes praktische Szenario -- vom einfachen Export bis zum Schreiben von DataFrames mit Millionen von Zeilen in Blöcken -- damit Sie Daten beim ersten Versuch korrekt exportieren können.
Grundlegende Verwendung
Der einfachste Aufruf schreibt einen DataFrame in eine CSV-Datei im aktuellen Arbeitsverzeichnis:
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'age': [28, 35, 42],
'salary': [72000, 88000, 95000]
})
df.to_csv('employees.csv')Dies erstellt employees.csv mit folgendem Inhalt:
,name,age,salary
0,Alice,28,72000
1,Bob,35,88000
2,Charlie,42,95000Beachten Sie die erste Spalte -- das ist der DataFrame-Index. In den meisten Fällen möchten Sie ihn nicht. Beheben Sie dies mit index=False:
df.to_csv('employees.csv', index=False)Ausgabe:
name,age,salary
Alice,28,72000
Bob,35,88000
Charlie,42,95000Vollständige Methodensignatur
Hier ist die vollständige to_csv()-Signatur mit den am häufigsten verwendeten Parametern:
DataFrame.to_csv(
path_or_buf=None, # Dateipfad oder Puffer
sep=',', # Trennzeichen
na_rep='', # Zeichenkette für fehlende Werte
float_format=None, # Formatstring für Gleitkommazahlen
columns=None, # Teilmenge der zu schreibenden Spalten
header=True, # Spaltennamen schreiben
index=True, # Zeilenindex schreiben
index_label=None, # Spaltenlabel für Index
mode='w', # Schreibmodus ('w', 'a', 'x')
encoding=None, # Dateikodierung (Standard utf-8)
compression='infer',# Komprimierungstyp
quoting=None, # csv.QUOTE_*-Konstante
lineterminator=None,# Zeilenumbruchzeichen
chunksize=None, # Zeilen pro Block
date_format=None, # Formatstring für Datum/Uhrzeit
errors='strict', # Fehlerbehandlung bei Kodierung
)Wichtige Parameter erklärt
sep -- Benutzerdefinierte Trennzeichen
Nicht jedes System liest Kommas. Verwenden Sie sep, um das Trennzeichen zu ändern:
import pandas as pd
df = pd.DataFrame({
'product': ['Widget A', 'Widget B'],
'price': [19.99, 29.99]
})
# Tabulator-getrennt
df.to_csv('products.tsv', sep='\t', index=False)
# Semikolon-getrennt (üblich in europäischen Regionen)
df.to_csv('products_eu.csv', sep=';', index=False)
# Pipe-getrennt
df.to_csv('products.txt', sep='|', index=False)columns -- Eine Teilmenge exportieren
Schreiben Sie nur bestimmte Spalten anstatt des gesamten DataFrames:
import pandas as pd
df = pd.DataFrame({
'id': [1, 2, 3],
'name': ['Alice', 'Bob', 'Charlie'],
'email': ['a@x.com', 'b@x.com', 'c@x.com'],
'internal_score': [0.87, 0.92, 0.78]
})
# Nur die Spalten exportieren, die der Kunde benötigt
df.to_csv('export.csv', columns=['id', 'name', 'email'], index=False)header -- Spaltennamen steuern
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'score': [85, 92]
})
# Keine Kopfzeile
df.to_csv('no_header.csv', header=False, index=False)
# Benutzerdefinierte Kopfzeilennamen
df.to_csv('custom_header.csv', header=['Vollständiger Name', 'Testergebnis'], index=False)na_rep -- Fehlende Werte darstellen
Standardmäßig werden NaN-Werte zu leeren Zeichenketten. Verwenden Sie na_rep, um sie explizit zu machen:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'sensor': ['A', 'B', 'C'],
'reading': [23.5, np.nan, 18.2]
})
# Standard: leere Zeichenkette für NaN
df.to_csv('readings_default.csv', index=False)
# sensor,reading
# A,23.5
# B,
# C,18.2
# Explizite Markierung fehlender Werte
df.to_csv('readings_marked.csv', na_rep='NULL', index=False)
# sensor,reading
# A,23.5
# B,NULL
# C,18.2float_format -- Dezimalgenauigkeit steuern
import pandas as pd
df = pd.DataFrame({
'item': ['Widget', 'Gadget'],
'price': [19.999999, 42.123456]
})
# Zwei Dezimalstellen
df.to_csv('prices.csv', float_format='%.2f', index=False)
# item,price
# Widget,20.00
# Gadget,42.12date_format -- Datum/Uhrzeit-Spalten formatieren
import pandas as pd
df = pd.DataFrame({
'event': ['Launch', 'Review'],
'date': pd.to_datetime(['2026-03-15 14:30:00', '2026-04-01 09:00:00'])
})
# Nur ISO-Datum (keine Uhrzeit)
df.to_csv('events.csv', date_format='%Y-%m-%d', index=False)
# event,date
# Launch,2026-03-15
# Review,2026-04-01Umgang mit Kodierung und Sonderzeichen
Kodierung ist die Hauptursache für verstümmelte CSV-Dateien. Die Standardkodierung in to_csv() ist utf-8, was für die meisten Systeme funktioniert. Aber Excel unter Windows erwartet ein BOM (Byte Order Mark), um Nicht-ASCII-Zeichen korrekt anzuzeigen.
UTF-8 (Standard)
import pandas as pd
df = pd.DataFrame({
'city': ['Zürich', 'München', 'Tokyo'],
'greeting': ['Grüezi', 'Servus', 'Konnichiwa']
})
# Standard-UTF-8
df.to_csv('cities.csv', index=False, encoding='utf-8')UTF-8 mit BOM für Excel
Wenn Ihre CSV akzentuierte Zeichen, CJK-Text oder Sondersymbole enthält und in Microsoft Excel korrekt geöffnet werden muss:
import pandas as pd
df = pd.DataFrame({
'city': ['Zürich', 'München', 'São Paulo', 'Beijing'],
'population': [434000, 1472000, 12330000, 21540000]
})
# utf-8-sig fügt ein BOM hinzu, das Excel erkennt
df.to_csv('cities_excel.csv', index=False, encoding='utf-8-sig')Andere Kodierungen
import pandas as pd
df = pd.DataFrame({'col': ['data']})
# Latin-1 für ältere westeuropäische Systeme
df.to_csv('legacy.csv', index=False, encoding='latin-1')
# Shift-JIS für ältere japanische Systeme
df.to_csv('japanese.csv', index=False, encoding='shift_jis')| Kodierung | Wann verwenden | Excel-kompatibel? |
|---|---|---|
utf-8 | Standard für die meisten Systeme, APIs, Datenbanken | Teilweise (kein BOM) |
utf-8-sig | Excel unter Windows mit Nicht-ASCII-Text | Ja |
latin-1 / iso-8859-1 | Ältere westeuropäische Systeme | Ja |
shift_jis | Ältere japanische Systeme | Ja |
cp1252 | Windows westeuropäisch | Ja |
Große DataFrames: Komprimierung und Chunking
Komprimierung
Komprimierung reduziert die Dateigröße um 60-90% ohne Datenverlust. Pandas unterstützt mehrere Formate:
import pandas as pd
import numpy as np
# Einen großen DataFrame erstellen
df = pd.DataFrame({
'id': range(1_000_000),
'value': np.random.randn(1_000_000),
'category': np.random.choice(['A', 'B', 'C', 'D'], 1_000_000)
})
# Gzip-Komprimierung (am häufigsten)
df.to_csv('large_data.csv.gz', index=False, compression='gzip')
# Zip-Komprimierung
df.to_csv('large_data.zip', index=False, compression='zip')
# Bz2-Komprimierung (kleiner aber langsamer)
df.to_csv('large_data.csv.bz2', index=False, compression='bz2')
# Zstandard (schnell, gutes Verhältnis -- erfordert zstandard-Paket)
df.to_csv('large_data.csv.zst', index=False, compression='zstd')| Komprimierung | Dateierweiterung | Geschwindigkeit | Größenreduktion | Zurücklesen |
|---|---|---|---|---|
| Keine | .csv | Schnellstes Schreiben | 0% | pd.read_csv('f.csv') |
| gzip | .csv.gz | Mittel | 70-85% | pd.read_csv('f.csv.gz') |
| zip | .zip | Mittel | 70-85% | pd.read_csv('f.zip') |
| bz2 | .csv.bz2 | Langsam | 75-90% | pd.read_csv('f.csv.bz2') |
| zstd | .csv.zst | Schnell | 70-85% | pd.read_csv('f.csv.zst') |
Pandas leitet das Komprimierungsformat automatisch aus der Dateierweiterung ab, daher funktioniert compression='infer' (der Standard) in der Regel.
Chunksize -- In Stapeln schreiben
Für sehr große DataFrames, die den Speicher belasten, schreiben Sie in Blöcken:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'id': range(5_000_000),
'value': np.random.randn(5_000_000)
})
# 500.000 Zeilen gleichzeitig schreiben
df.to_csv('huge_data.csv', index=False, chunksize=500_000)Der Parameter chunksize reduziert nicht die endgültige Dateigröße -- er steuert, wie viele Zeilen gleichzeitig auf die Festplatte geschrieben werden. Dies kann helfen, die Spitzenspeichernutzung während des Schreibvorgangs zu reduzieren.
In einen String oder Puffer schreiben
Sie schreiben nicht immer in eine Datei. Manchmal benötigen Sie die CSV als String für einen API-Aufruf, einen Datenbankeintrag oder die Verarbeitung im Speicher:
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'score': [85, 92]
})
# CSV als String erhalten
csv_string = df.to_csv(index=False)
print(csv_string)
# name,score
# Alice,85
# Bob,92In StringIO oder BytesIO schreiben
import pandas as pd
from io import StringIO, BytesIO
df = pd.DataFrame({
'x': [1, 2, 3],
'y': [4, 5, 6]
})
# StringIO-Puffer
buffer = StringIO()
df.to_csv(buffer, index=False)
csv_text = buffer.getvalue()
# BytesIO-Puffer (nützlich für HTTP-Antworten, S3-Uploads)
byte_buffer = BytesIO()
df.to_csv(byte_buffer, index=False, encoding='utf-8')
csv_bytes = byte_buffer.getvalue()Dieses Muster wird häufig verwendet, wenn CSV-Daten in Cloud-Speicher (S3, GCS) hochgeladen werden, ohne eine lokale Datei zu erstellen.
An eine bestehende CSV anhängen
Um Zeilen zu einer bestehenden Datei hinzuzufügen, ohne sie zu überschreiben, verwenden Sie mode='a' und header=False:
import pandas as pd
# Erster Stapel -- mit Kopfzeile schreiben
df1 = pd.DataFrame({'name': ['Alice'], 'score': [85]})
df1.to_csv('results.csv', index=False)
# Zweiter Stapel -- anhängen ohne die Kopfzeile zu duplizieren
df2 = pd.DataFrame({'name': ['Bob', 'Charlie'], 'score': [92, 78]})
df2.to_csv('results.csv', mode='a', header=False, index=False)Die resultierende Datei hat eine Kopfzeile, gefolgt von allen drei Datenzeilen. Das Weglassen von header=False würde eine zweite Kopfzeile mitten in den Daten einfügen.
Quoting und Escaping
Felder, die das Trennzeichen, Zeilenumbrüche oder Anführungszeichen enthalten, benötigen korrektes Quoting. Pandas handhabt dies automatisch, aber Sie können das Verhalten steuern:
import pandas as pd
import csv
df = pd.DataFrame({
'name': ['O\'Brien', 'Smith, Jr.', 'Alice "Ace" Wong'],
'notes': ['Enthält Apostroph', 'Enthält Komma', 'Enthält Anführungszeichen']
})
# Standard: nur bei Bedarf quoten (QUOTE_MINIMAL)
df.to_csv('minimal.csv', index=False)
# Alle Felder quoten
df.to_csv('all_quoted.csv', index=False, quoting=csv.QUOTE_ALL)
# Nur nicht-numerische Felder quoten
df.to_csv('nonnumeric.csv', index=False, quoting=csv.QUOTE_NONNUMERIC)Exportformat-Vergleich: to_csv() vs to_excel() vs to_parquet()
Die Wahl des richtigen Exportformats hängt davon ab, wer die Datei nutzt und wie groß sie ist:
| Merkmal | to_csv() | to_excel() | to_parquet() |
|---|---|---|---|
| Dateiformat | Klartext | Binär (xlsx) | Binär (spaltenbasiert) |
| Menschlich lesbar | Ja | Über Excel/Sheets | Nein |
| Dateigröße (1M Zeilen) | ~50-100 MB | ~30-60 MB | ~5-15 MB |
| Schreibgeschwindigkeit | Schnell | Langsam | Schnell |
| Lesegeschwindigkeit | Mittel | Langsam | Sehr schnell |
| Typerhaltung | Nein (alles Strings) | Teilweise | Vollständig |
| Erfordert zusätzliche Bibliothek | Nein | openpyxl | pyarrow / fastparquet |
| Komprimierungsunterstützung | gzip, zip, bz2, zstd | Eingebaut | Eingebaut (snappy, gzip) |
| Am besten für | Interoperabilität, APIs, schnelles Teilen | Geschäftsanwender, Excel-Nutzer | Analyse-Pipelines, Big Data |
Faustregel: Verwenden Sie CSV zum Teilen von Daten mit nicht-technischen Benutzern oder externen Systemen. Verwenden Sie Parquet für interne Pipelines, wo Geschwindigkeit und Typgenauigkeit wichtig sind. Verwenden Sie Excel, wenn der Empfänger Formatierung oder mehrere Blätter benötigt.
Häufige Fallstricke und wie man sie vermeidet
1. Unerwünschte Index-Spalte
Die häufigste Beschwerde. Übergeben Sie immer index=False, es sei denn, Ihr Index enthält bedeutungsvolle Daten:
# Falsch -- fügt beim Zurücklesen eine mysteriöse "Unnamed: 0"-Spalte hinzu
df.to_csv('data.csv')
# Richtig
df.to_csv('data.csv', index=False)2. Unbenannte Spalten beim Zurücklesen
Wenn Sie mit Index exportiert und die Datei dann zurückgelesen haben, erhalten Sie eine Unnamed: 0-Spalte:
import pandas as pd
# CSV zurücklesen, die mit Index exportiert wurde
df = pd.read_csv('data.csv', index_col=0) # read_csv mitteilen, welche Spalte der Index ist3. Verlust der Datum/Uhrzeit-Genauigkeit
Ohne date_format werden Datum/Uhrzeit-Spalten als vollständige Zeitstempel einschließlich Mikrosekunden exportiert. Steuern Sie dies explizit:
import pandas as pd
df = pd.DataFrame({
'ts': pd.to_datetime(['2026-01-15 08:30:00.123456'])
})
df.to_csv('ts.csv', index=False, date_format='%Y-%m-%d %H:%M:%S')4. Rundungsprobleme bei Gleitkommazahlen
Gleitkommazahlen können unerwartete nachfolgende Ziffern erzeugen:
import pandas as pd
df = pd.DataFrame({'val': [0.1 + 0.2]})
df.to_csv('float.csv', index=False)
# val
# 0.30000000000000004
df.to_csv('float_clean.csv', index=False, float_format='%.2f')
# val
# 0.305. Gemischte Typen in einer Spalte
Wenn eine Spalte gemischte Typen hat (Ganzzahlen und Strings), konvertiert to_csv() alles in Strings. Überprüfen Sie Ihre Datentypen vor dem Export:
import pandas as pd
df = pd.DataFrame({'id': [1, 2, 'three']})
print(df.dtypes)
# id object <-- gemischter Typ
# Vor dem Export bereinigen
df['id'] = pd.to_numeric(df['id'], errors='coerce')
df.to_csv('clean.csv', index=False)Visualisieren Sie Ihre Daten vor dem Export mit PyGWalker
Bevor Sie einen DataFrame in CSV exportieren, ist es hilfreich zu überprüfen, ob die Daten korrekt aussehen. PyGWalker (opens in a new tab) verwandelt jeden Pandas DataFrame in eine interaktive visuelle Oberfläche im Jupyter Notebook -- ziehen Sie Spalten per Drag & Drop, um Diagramme zu erstellen, ohne Plot-Code schreiben zu müssen:
import pandas as pd
import pygwalker as pyg
df = pd.read_csv('raw_data.csv')
# Visuell erkunden vor dem Export
walker = pyg.walk(df)
# Wenn zufrieden, exportieren
df.to_csv('verified_export.csv', index=False, encoding='utf-8-sig')Dieser Workflow erkennt Probleme wie unerwartete Nullwerte, Ausreißer oder falsche Datentypen, bevor sie Ihren CSV-Verbraucher erreichen.
FAQ
Wie exportiere ich einen Pandas DataFrame in CSV ohne Index?
Übergeben Sie index=False an to_csv(): df.to_csv('file.csv', index=False). Dies verhindert, dass der Zeilenindex als erste Spalte geschrieben wird. Beim Zurücklesen der Datei sehen Sie keine zusätzliche Unnamed: 0-Spalte.
Wie gehe ich mit Sonderzeichen und Kodierung beim CSV-Export um?
Verwenden Sie encoding='utf-8-sig', wenn die CSV in Microsoft Excel mit Nicht-ASCII-Zeichen (akzentuierte Buchstaben, CJK-Text) korrekt geöffnet werden muss. Für Standardsysteme und APIs funktioniert die Standard-encoding='utf-8'. Für Altsysteme verwenden Sie die spezifische Kodierung, die sie erfordern (latin-1, shift_jis, etc.).
Wie komprimiere ich eine große CSV-Datei beim Export aus Pandas?
Fügen Sie der Dateinamenerweiterung eine Komprimierung hinzu und Pandas erledigt den Rest: df.to_csv('data.csv.gz', index=False) erstellt eine gzip-komprimierte Datei. Sie können auch compression='gzip', 'zip', 'bz2' oder 'zstd' explizit setzen. Komprimierte Dateien sind typischerweise 70-90% kleiner und können direkt mit pd.read_csv() zurückgelesen werden.
Kann ich Daten an eine bestehende CSV-Datei anhängen, anstatt sie zu überschreiben?
Ja. Verwenden Sie mode='a' und header=False: df.to_csv('file.csv', mode='a', header=False, index=False). mode='a' öffnet die Datei zum Anhängen, und header=False verhindert das Schreiben einer doppelten Kopfzeile mitten in der Datei.
Was ist der Unterschied zwischen to_csv() und to_parquet() in Pandas?
to_csv() erzeugt eine menschenlesbare Textdatei, verliert aber Typinformationen (alles wird zu Strings). to_parquet() erstellt eine kompakte Binärdatei, die Datentypen (Ganzzahlen, Gleitkommazahlen, Datum/Uhrzeit) bewahrt, 5-10x schneller gelesen wird und 5-10x kleiner ist. Verwenden Sie CSV zum Teilen mit nicht-technischen Benutzern oder externen Systemen. Verwenden Sie Parquet für interne Datenpipelines, wo Leistung und Typgenauigkeit wichtig sind.
Fazit
DataFrame.to_csv() ist die Standardmethode zum Exportieren von Pandas-Daten in CSV-Dateien. Für saubere Exporte übergeben Sie immer index=False. Verwenden Sie encoding='utf-8-sig', wenn Excel-Kompatibilität wichtig ist. Komprimieren Sie große Dateien mit gzip oder zstd, um die Größe um 70-90% zu reduzieren. Steuern Sie die Dezimalgenauigkeit mit float_format, behandeln Sie fehlende Werte mit na_rep und hängen Sie an bestehende Dateien mit mode='a' an. Für Datenpipelines, in denen Typerhaltung und Geschwindigkeit wichtig sind, erwägen Sie stattdessen to_parquet(). Überprüfen Sie Ihre Daten vor dem Export visuell mit Tools wie PyGWalker, um Probleme frühzeitig zu erkennen.