Data Wrangling: Vollständiger Leitfaden zum Bereinigen und Transformieren von Daten mit Python
Updated on
Jedes Datenprojekt beginnt mit der gleichen unangenehmen Wahrheit: Rohdaten sind unordentlich. Spalten haben inkonsistente Formate. Datumsangaben kommen als Strings an. Kundendatensätze enthalten Duplikate. CSV-Dateien aus verschiedenen Abteilungen verwenden unterschiedliche Namenskonventionen für dieselben Felder. Sie können keine zuverlässigen Modelle, Dashboards oder Berichte auf Daten aufbauen, denen Sie nicht vertrauen.
Data Wrangling ist der Prozess, diese rohen, unzuverlässigen Daten in etwas Sauberes, Strukturiertes und Analysebereites zu verwandeln. Laut mehreren Branchenumfragen verbraucht es bis zu 80% der Zeit eines Datenprofis, und dennoch bleibt es eine der am wenigsten gelehrten Fähigkeiten in Data-Science-Curricula. Dieser Leitfaden führt durch die gesamte Data Wrangling-Pipeline mit Python und Pandas, mit praktischem Code für jeden Schritt.
Was ist Data Wrangling?
Data Wrangling (auch Data Munging genannt) ist der Prozess des Entdeckens, Strukturierens, Bereinigens, Anreicherns und Validierens von Rohdaten, damit sie für Analysen oder maschinelles Lernen verwendet werden können. Es steht zwischen Datensammlung und Datenanalyse im Workflow.
Data Wrangling vs Data Cleaning vs ETL
Diese drei Begriffe überschneiden sich, bedeuten aber verschiedene Dinge:
| Begriff | Umfang | Fokus | Typische Werkzeuge |
|---|---|---|---|
| Data Wrangling | Breit -- umfasst den gesamten Prozess von roh bis analysebereit | Exploration, Umformung, Bereinigung, Anreicherung | Pandas, Polars, Python-Skripte |
| Data Cleaning | Eng -- eine Teilmenge des Wrangling | Fehler beheben, fehlende Werte behandeln, Duplikate entfernen | Pandas, OpenRefine, SQL |
| ETL (Extract, Transform, Load) | Systemebene -- automatisierte Pipelines | Daten zwischen Systemen in großem Maßstab bewegen | Airflow, dbt, Spark, AWS Glue |
Data Cleaning ist ein Schritt innerhalb von Data Wrangling. ETL ist eine Pipeline auf Produktionsebene, die Wrangling-Logik enthalten kann, sich aber auf Systemintegration und Automatisierung konzentriert.
Die Data Wrangling-Pipeline
Ein strukturierter Wrangling-Workflow hat fünf Stufen:
1. Entdecken -- Laden Sie die Daten und verstehen Sie ihre Form, Typen, Verteilungen und Probleme.
2. Strukturieren -- Formen Sie Spalten und Zeilen um, damit die Daten dem benötigten Schema entsprechen.
3. Bereinigen -- Behandeln Sie fehlende Werte, korrigieren Sie Datentypen, entfernen Sie Duplikate und beheben Sie Fehler.
4. Anreichern -- Fügen Sie abgeleitete Spalten hinzu, verbinden Sie mit externen Datensätzen, kategorisieren Sie kontinuierliche Werte.
5. Validieren -- Bestätigen Sie, dass die Ausgabe den Erwartungen entspricht.
Stufe 1: Ihre Daten entdecken
Beginnen Sie jedes Wrangling-Projekt damit, zu verstehen, was Sie haben:
import pandas as pd
df = pd.read_csv("sales_data.csv")
# Form und grundlegende Informationen
print(f"Zeilen: {df.shape[0]}, Spalten: {df.shape[1]}")
df.info()
# Statistische Zusammenfassung
df.describe(include="all")
# Fehlende Werte prüfen
df.isnull().sum().sort_values(ascending=False)
# Auf Duplikate prüfen
print(f"Doppelte Zeilen: {df.duplicated().sum()}")
# Einzigartige Werte in kategorischen Spalten anzeigen
for col in df.select_dtypes(include="object").columns:
print(f"{col}: {df[col].nunique()} einzigartige Werte")
print(df[col].value_counts().head(5))
print()Für einen visuellen Ansatz zur Datenentdeckung verwandelt PyGWalker (opens in a new tab) jeden Pandas DataFrame in eine interaktive Tableau-ähnliche Oberfläche:
import pygwalker as pyg walker = pyg.walk(df)
Stufe 2: Strukturieren und Umformen
Spalten umbenennen
# Spaltennamen standardisieren: Kleinbuchstaben, Unterstriche, keine Leerzeichen
df.columns = (
df.columns
.str.strip()
.str.lower()
.str.replace(" ", "_")
.str.replace(r"[^\w]", "", regex=True)
)Umformen mit Pivot und Melt
# Pivot: Langes Format in breites Format konvertieren
sales_wide = df.pivot_table(
index="product",
columns="month",
values="revenue",
aggfunc="sum"
)
# Melt: Breites Format zurück in langes Format
sales_long = sales_wide.reset_index().melt(
id_vars="product",
var_name="month",
value_name="revenue"
)Stufe 3: Daten bereinigen
Fehlende Werte behandeln
# Strategie 1: Zeilen mit fehlenden Werten entfernen
df_dropped = df.dropna()
# Strategie 2: Nur Zeilen mit fehlenden Werten in bestimmten Spalten entfernen
df_dropped = df.dropna(subset=["revenue", "customer_id"])
# Strategie 3: Mit einer Konstante füllen
df["category"] = df["category"].fillna("Unbekannt")
# Strategie 4: Mit Spaltenstatistik füllen
df["revenue"] = df["revenue"].fillna(df["revenue"].median())
# Strategie 5: Vorwärts füllen (gut für Zeitreihen)
df["price"] = df["price"].ffill()
# Strategie 6: Interpolation (gut für numerische Zeitreihen)
df["temperature"] = df["temperature"].interpolate(method="linear")Welche Strategie wählen:
| Situation | Empfohlener Ansatz |
|---|---|
| Weniger als 5% fehlen, zufällig | Zeilen entfernen |
| Kategorische Spalte | Mit "Unbekannt" oder Modus füllen |
| Numerische Spalte, Normalverteilung | Mit Mittelwert füllen |
| Numerische Spalte, schiefe Verteilung | Mit Median füllen |
| Zeitreihendaten | Vorwärts füllen oder Interpolation |
| Spalte hat > 50% fehlend | Spalte entfernen in Betracht ziehen |
Datentypkonvertierungen
# String zu Datetime
df["order_date"] = pd.to_datetime(df["order_date"], format="%Y-%m-%d")
# String zu numerisch (coerce wandelt nicht parsbare Werte in NaN um)
df["revenue"] = pd.to_numeric(df["revenue"], errors="coerce")
# Objekt zu Kategorie (spart Speicher)
df["status"] = df["status"].astype("category")
# Boolean-Konvertierung
df["is_active"] = df["is_active"].map({"yes": True, "no": False, "Y": True, "N": False})String-Bereinigung
# Leerzeichen entfernen
df["name"] = df["name"].str.strip()
# Groß-/Kleinschreibung standardisieren
df["city"] = df["city"].str.lower()
df["state"] = df["state"].str.upper()
# Muster mit Regex ersetzen
df["phone"] = df["phone"].str.replace(r"[^\d]", "", regex=True)
# Muster extrahieren
df["zip_code"] = df["address"].str.extract(r"(\d{5})")Duplikate behandeln
# Duplikate finden
print(f"Gesamte Duplikate: {df.duplicated().sum()}")
# Duplikate basierend auf bestimmten Spalten finden
dupes = df[df.duplicated(subset=["customer_id", "order_date"], keep=False)]
# Duplikate entfernen, erste Vorkommen behalten
df = df.drop_duplicates(subset=["customer_id", "order_date"], keep="first")Stufe 4: Anreichern -- Datensätze zusammenführen und verbinden
# Inner Join: nur übereinstimmende Zeilen
merged = pd.merge(orders, customers, on="customer_id", how="inner")
# Left Join: alle Bestellungen, mit Kundeninfo wo verfügbar
merged = pd.merge(orders, customers, on="customer_id", how="left")
# DataFrames vertikal verketten (Zeilen stapeln)
all_months = pd.concat([jan_df, feb_df, mar_df], ignore_index=True)Join-Typ-Referenz:
| Join-Typ | Behält | Verwendung |
|---|---|---|
inner | Nur übereinstimmende Zeilen aus beiden Tabellen | Sie brauchen nur vollständige Datensätze |
left | Alle Zeilen von links, Übereinstimmungen von rechts | Linke Tabelle ist Ihr primärer Datensatz |
right | Alle Zeilen von rechts, Übereinstimmungen von links | Rechte Tabelle ist Ihr primärer Datensatz |
outer | Alle Zeilen aus beiden Tabellen | Sie brauchen die vollständige Vereinigung |
Abgeleitete Spalten hinzufügen
# Berechnete Spalten
df["profit"] = df["revenue"] - df["cost"]
df["profit_margin"] = (df["profit"] / df["revenue"] * 100).round(2)
# Kontinuierliche Werte kategorisieren
df["revenue_tier"] = pd.cut(
df["revenue"],
bins=[0, 100, 500, 1000, float("inf")],
labels=["Niedrig", "Mittel", "Hoch", "Premium"]
)Stufe 5: Validieren
def validate_dataframe(df):
"""Grundlegende Validierungsprüfungen auf einem bereinigten DataFrame ausführen."""
checks = {}
required = ["customer_id", "order_date", "revenue"]
for col in required:
null_count = df[col].isnull().sum()
checks[f"no_nulls_{col}"] = null_count == 0
if null_count > 0:
print(f"WARNUNG: {col} hat {null_count} Null-Werte")
neg_revenue = (df["revenue"] < 0).sum()
checks["positive_revenue"] = neg_revenue == 0
passed = sum(checks.values())
total = len(checks)
print(f"\nValidierung: {passed}/{total} Prüfungen bestanden")
return checks
validate_dataframe(df)Ausreißererkennung und -behandlung
import numpy as np
# Methode 1: IQR (Interquartilabstand)
Q1 = df["revenue"].quantile(0.25)
Q3 = df["revenue"].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df["revenue"] < lower) | (df["revenue"] > upper)]
print(f"IQR-Ausreißer: {len(outliers)} Zeilen")
# Behandlungsoptionen
# Option A: Ausreißer entfernen
df_clean = df[(df["revenue"] >= lower) & (df["revenue"] <= upper)]
# Option B: Ausreißer deckeln (Winsorisierung)
df["revenue_capped"] = df["revenue"].clip(lower=lower, upper=upper)
# Option C: Ausreißer zur manuellen Überprüfung markieren
df["is_outlier"] = (df["revenue"] < lower) | (df["revenue"] > upper)Vollständiges Wrangling-Pipeline-Beispiel
import pandas as pd
import numpy as np
def wrangle_sales_data(filepath):
"""Vollständige Data Wrangling-Pipeline für Verkaufsdaten."""
df = pd.read_csv(filepath)
df.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")
df["order_date"] = pd.to_datetime(df["order_date"], errors="coerce")
df["revenue"] = pd.to_numeric(df["revenue"], errors="coerce")
df["quantity"] = pd.to_numeric(df["quantity"], errors="coerce")
for col in df.select_dtypes(include="object").columns:
df[col] = df[col].str.strip()
df = df.dropna(subset=["order_date", "customer_id"])
df["revenue"] = df["revenue"].fillna(df["revenue"].median())
df["category"] = df["category"].fillna("Unbekannt")
df = df.drop_duplicates(subset=["customer_id", "order_date", "product_id"], keep="first")
df["order_year"] = df["order_date"].dt.year
df["order_month"] = df["order_date"].dt.month
Q1 = df["revenue"].quantile(0.25)
Q3 = df["revenue"].quantile(0.75)
IQR = Q3 - Q1
df = df[(df["revenue"] >= Q1 - 1.5 * IQR) & (df["revenue"] <= Q3 + 1.5 * IQR)]
df = df.reset_index(drop=True)
return df
clean_df = wrangle_sales_data("raw_sales.csv")
print(f"Bereinigter Datensatz: {clean_df.shape[0]} Zeilen, {clean_df.shape[1]} Spalten")Pandas vs Polars vs SQL für Data Wrangling
| Kriterium | Pandas | Polars | SQL |
|---|---|---|---|
| Sprache | Python | Python / Rust | SQL |
| Geschwindigkeit (1GB-Datei) | Langsam (Single-Threaded) | Schnell (Multi-Threaded, Rust) | Abhängig von der Engine |
| Speicherverbrauch | Hoch (Eager Evaluation) | Niedriger (Lazy Evaluation) | Engine-verwaltet |
| Am besten für | Explorative Analyse, Prototyping | Große Datensätze, Performance | Datenbankresidente Daten |
KI-gestütztes Data Wrangling
Manuelles Data Wrangling ist zeitaufwändig und fehleranfällig. KI-Werkzeuge können den Prozess beschleunigen.
RunCell (opens in a new tab) bringt einen KI-Agenten direkt in Ihr Jupyter-Notebook. Statt jeden Bereinigungsschritt von Hand zu schreiben, können Sie in natürlicher Sprache beschreiben, was Sie brauchen, und RunCell generiert den Pandas-Code.
FAQ
Was ist Data Wrangling in einfachen Worten?
Data Wrangling ist der Prozess, rohe, unordentliche Daten in ein sauberes, strukturiertes Format umzuwandeln, das für die Analyse geeignet ist. Es umfasst das Beheben fehlender Werte, das Korrigieren von Datentypen, das Entfernen von Duplikaten, das Umformen von Tabellen und das Zusammenführen von Datensätzen.
Was ist der Unterschied zwischen Data Wrangling und Data Cleaning?
Data Cleaning ist ein Schritt innerhalb von Data Wrangling. Cleaning konzentriert sich speziell auf das Beheben von Fehlern. Data Wrangling ist breiter und umfasst alles von der ersten Exploration bis zur Validierung.
Welche Werkzeuge werden für Data Wrangling verwendet?
Python mit Pandas ist das gebräuchlichste Werkzeug. Andere Optionen sind Polars, SQL, R mit dplyr und kommerzielle Werkzeuge. Für visuelle Exploration bietet PyGWalker eine interaktive Drag-and-Drop-Oberfläche auf Pandas DataFrames.
Wie viel Zeit verbringen Data Scientists mit Data Wrangling?
Branchenumfragen berichten konsistent, dass Datenprofis 60-80% ihrer Zeit mit Data Wrangling und Vorbereitung verbringen.
Was sind die Schritte im Data Wrangling?
Die fünf Hauptschritte sind: (1) Entdecken, (2) Strukturieren, (3) Bereinigen, (4) Anreichern, (5) Validieren.
Fazit
Data Wrangling ist das unspektakuläre Fundament, das jede nachgelagerte Analyse möglich macht. Die wichtigsten Erkenntnisse: Immer zuerst erkunden, bevor Sie bereinigen, die Fünf-Stufen-Pipeline verwenden, die richtige Strategie für fehlende Werte je Spalte wählen, Ihre Ausgabe validieren und Ihre Entscheidungen dokumentieren.
Bauen Sie Ihre Wrangling-Logik in wiederverwendbare Funktionen, nicht in einmalige Skripte. Die Daten werden sich ändern. Die Quellen werden sich ändern. Ihre Pipeline sollte beides elegant handhaben.