CSV-Datenbereinigungstipps für Analysten und Entwickler
CSV-Dateien sind das universelle Austauschformat für tabellarische Daten. Sie sind einfach, für Menschen lesbar und werden von jedem Tool unterstützt — von Excel bis pandas. Aber CSV-Dateien aus der Praxis sind oft unsauber — inkonsistente Kodierungen, fehlende Werte, gemischte Datentypen und fehlerhafte Zeilen. Dieser Leitfaden behandelt praktische Techniken zur zuverlässigen Bereinigung von CSV-Daten.
Häufige CSV-Probleme
1. Kodierungsprobleme
Das frustrierendste CSV-Problem ist die Kodierung. Eine in Excel unter Windows erstellte Datei verwendet möglicherweise windows-1252, während Ihr Python-Skript utf-8 erwartet.
Symptome: Verstümmelte Zeichen (Mojibake) wie é statt é, oder UnicodeDecodeError-Ausnahmen.
Erkennung:
import chardet
with open('data.csv', 'rb') as f:
result = chardet.detect(f.read(10000))
print(result) # {'encoding': 'Windows-1252', 'confidence': 0.73}
Lösung: Mit der erkannten Kodierung lesen, dann als UTF-8 speichern:
import pandas as pd
df = pd.read_csv('data.csv', encoding='windows-1252')
df.to_csv('data_clean.csv', encoding='utf-8', index=False)
2. Inkonsistente Trennzeichen
Nicht alle „CSVs" verwenden Kommas. Europäische CSV-Dateien verwenden oft Semikolons, da Kommas in vielen europäischen Gebietseinstellungen als Dezimaltrennzeichen dienen.
# Trennzeichen automatisch erkennen
import csv
with open('data.csv', 'r') as f:
dialect = csv.Sniffer().sniff(f.read(5000))
print(f"Trennzeichen: {repr(dialect.delimiter)}")
Unser CSV-Editor erkennt Trennzeichen automatisch — fügen Sie Ihre Daten ein und er identifiziert das Format.
3. Fehlende Werte
Fehlende Daten erscheinen in vielen Formen: leere Zellen, NA, N/A, null, - oder nur Leerzeichen.
# Alle Darstellungen fehlender Werte standardisieren
df = pd.read_csv('data.csv', na_values=['NA', 'N/A', 'null', '-', '', ' '])
# Fehlende Werte pro Spalte prüfen
print(df.isnull().sum())
# Strategie 1: Zeilen mit fehlenden kritischen Feldern entfernen
df = df.dropna(subset=['email', 'name'])
# Strategie 2: Mit Standardwerten füllen
df['country'] = df['country'].fillna('Unknown')
# Strategie 3: Vorwärts füllen (Zeitreihen)
df['price'] = df['price'].ffill()
4. Doppelte Zeilen
Exakte Duplikate sind leicht zu finden. Unscharfe Duplikate (dieselbe Person mit leicht unterschiedlicher Namensschreibweise) sind schwieriger.
# Exakte Duplikate finden
duplicates = df[df.duplicated(keep=False)]
print(f"{len(duplicates)} doppelte Zeilen gefunden")
# Duplikate entfernen, erstes Vorkommen behalten
df = df.drop_duplicates()
# Duplikate basierend auf bestimmten Spalten entfernen
df = df.drop_duplicates(subset=['email'], keep='last')
5. Inkonsistente Datenformate
Daten in gemischten Formaten, Telefonnummern mit und ohne Landesvorwahl, inkonsistente Groß-/Kleinschreibung:
# Datumsformate standardisieren
df['date'] = pd.to_datetime(df['date'], format='mixed', dayfirst=False)
# Textfelder standardisieren
df['name'] = df['name'].str.strip().str.title()
df['email'] = df['email'].str.strip().str.lower()
# Telefonnummern standardisieren (einfach)
df['phone'] = df['phone'].str.replace(r'[^0-9+]', '', regex=True)
6. Datentypprobleme
CSV speichert alles als Text. Zahlen mit führenden Nullen, Postleitzahlen und Telefonnummern können beim Parsen ihre Formatierung verlieren:
# Führende Nullen bei Postleitzahlen erhalten
df = pd.read_csv('data.csv', dtype={'zip_code': str, 'phone': str})
# Währungszeichenfolgen in Zahlen konvertieren
df['price'] = df['price'].str.replace('$', '').str.replace(',', '').astype(float)
Validierung nach der Bereinigung
Validieren Sie immer Ihre bereinigten Daten:
# Zeilenanzahl prüfen (haben wir unerwartet Zeilen verloren oder gewonnen?)
print(f"Zeilen: {len(df)}")
# Datentypen prüfen
print(df.dtypes)
# Wertebereiche prüfen
print(df.describe())
# Auf verbleibende Nullwerte prüfen
print(df.isnull().sum())
# Eindeutigkeitsbedingungen validieren
assert df['email'].is_unique, "Doppelte E-Mails gefunden!"
Kommandozeilen-Tools
Für schnelle Bereinigung ohne Code zu schreiben:
# Kodierung konvertieren
iconv -f WINDOWS-1252 -t UTF-8 input.csv > output.csv
# Sortieren und doppelte Zeilen entfernen
sort -u input.csv > output.csv
# Bestimmte Spalten extrahieren (cut)
cut -d',' -f1,3,5 input.csv > output.csv
# Zeilen filtern (awk)
awk -F',' '$3 > 100' input.csv > filtered.csv
Für komplexere Transformationen bieten Tools wie csvkit eine vollständige Suite von CSV-Hilfsprogrammen:
# Installieren
pip install csvkit
# Spaltennamen anzeigen
csvcut -n data.csv
# Zeilen filtern
csvgrep -c country -m "USA" data.csv > usa_only.csv
# In JSON konvertieren
csvjson data.csv > data.json
Konvertierung zwischen CSV und JSON? Unser CSV-zu-JSON-Konverter erledigt das sofort.
FAQ
Was ist die maximale Dateigröße für CSV-Verarbeitung?
Es gibt keine inhärente Grenze im CSV-Format. Die praktische Grenze hängt von Ihren Tools ab: Excel verarbeitet etwa 1 Million Zeilen, pandas funktioniert gut bis zu mehreren GB bei ausreichend RAM, und Tools wie Dask oder Polars verarbeiten Datensätze, die größer als der Arbeitsspeicher sind. Für browserbasierte Tools verarbeitet unser CSV-Editor Dateien bis zu 100 MB.
Sollte ich CSV oder JSON für den Datenaustausch verwenden?
CSV eignet sich am besten für flache, tabellarische Daten (Tabellenkalkulation, Datenbankexporte, einfache Listen). JSON ist besser für verschachtelte, hierarchische Daten (API-Antworten, Konfigurationen, Dokumente mit unterschiedlicher Struktur). Für einen detaillierten Vergleich siehe unseren CSV vs JSON vs XML-Leitfaden.
Verwandte Ressourcen
- CSV-Editor — CSV-Daten im Browser bearbeiten und bereinigen
- CSV-zu-JSON-Konvertierungsleitfaden — Zwischen Formaten konvertieren
- JSON-Formatierungs-Best-Practices — Mit der JSON-Ausgabe arbeiten