Skip to content
Data Wrangling: Vollständiger Leitfaden zum Bereinigen und Transformieren von Daten mit Python

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:

BegriffUmfangFokusTypische Werkzeuge
Data WranglingBreit -- umfasst den gesamten Prozess von roh bis analysebereitExploration, Umformung, Bereinigung, AnreicherungPandas, Polars, Python-Skripte
Data CleaningEng -- eine Teilmenge des WranglingFehler beheben, fehlende Werte behandeln, Duplikate entfernenPandas, OpenRefine, SQL
ETL (Extract, Transform, Load)Systemebene -- automatisierte PipelinesDaten zwischen Systemen in großem Maßstab bewegenAirflow, 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:

SituationEmpfohlener Ansatz
Weniger als 5% fehlen, zufälligZeilen entfernen
Kategorische SpalteMit "Unbekannt" oder Modus füllen
Numerische Spalte, NormalverteilungMit Mittelwert füllen
Numerische Spalte, schiefe VerteilungMit Median füllen
ZeitreihendatenVorwärts füllen oder Interpolation
Spalte hat > 50% fehlendSpalte 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-TypBehältVerwendung
innerNur übereinstimmende Zeilen aus beiden TabellenSie brauchen nur vollständige Datensätze
leftAlle Zeilen von links, Übereinstimmungen von rechtsLinke Tabelle ist Ihr primärer Datensatz
rightAlle Zeilen von rechts, Übereinstimmungen von linksRechte Tabelle ist Ihr primärer Datensatz
outerAlle Zeilen aus beiden TabellenSie 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

KriteriumPandasPolarsSQL
SprachePythonPython / RustSQL
Geschwindigkeit (1GB-Datei)Langsam (Single-Threaded)Schnell (Multi-Threaded, Rust)Abhängig von der Engine
SpeicherverbrauchHoch (Eager Evaluation)Niedriger (Lazy Evaluation)Engine-verwaltet
Am besten fürExplorative Analyse, PrototypingGroße Datensätze, PerformanceDatenbankresidente 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.

📚