Skip to content

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,95000

Beachten 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,95000

Vollstä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.2

float_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.12

date_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-01

Umgang 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')
KodierungWann verwendenExcel-kompatibel?
utf-8Standard für die meisten Systeme, APIs, DatenbankenTeilweise (kein BOM)
utf-8-sigExcel unter Windows mit Nicht-ASCII-TextJa
latin-1 / iso-8859-1Ältere westeuropäische SystemeJa
shift_jisÄltere japanische SystemeJa
cp1252Windows westeuropäischJa

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')
KomprimierungDateierweiterungGeschwindigkeitGrößenreduktionZurücklesen
Keine.csvSchnellstes Schreiben0%pd.read_csv('f.csv')
gzip.csv.gzMittel70-85%pd.read_csv('f.csv.gz')
zip.zipMittel70-85%pd.read_csv('f.zip')
bz2.csv.bz2Langsam75-90%pd.read_csv('f.csv.bz2')
zstd.csv.zstSchnell70-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,92

In 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:

Merkmalto_csv()to_excel()to_parquet()
DateiformatKlartextBinär (xlsx)Binär (spaltenbasiert)
Menschlich lesbarJaÜber Excel/SheetsNein
Dateigröße (1M Zeilen)~50-100 MB~30-60 MB~5-15 MB
SchreibgeschwindigkeitSchnellLangsamSchnell
LesegeschwindigkeitMittelLangsamSehr schnell
TyperhaltungNein (alles Strings)TeilweiseVollständig
Erfordert zusätzliche BibliothekNeinopenpyxlpyarrow / fastparquet
Komprimierungsunterstützunggzip, zip, bz2, zstdEingebautEingebaut (snappy, gzip)
Am besten fürInteroperabilität, APIs, schnelles TeilenGeschäftsanwender, Excel-NutzerAnalyse-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 ist

3. 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.30

5. 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.

📚