HOWTO · Pandas
Wenden Sie die Lambda-Funktion auf Pandas DataFrame an
In diesem Handbuch wird erläutert, wie Sie Lambda-Funktionen mithilfe der Methoden DataFrame.assign() und DataFrame.apply() auf Pandas DataFrame anwenden.
Auf dieser Seite
Verwenden Sie in Python lambda mit pandas, wenn eine kurze Funktion mit nur einem Ausdruck zur Aufgabe passt: Mit DataFrame.assign() erstellen Sie Spalten, DataFrame.apply() eignet sich für Berechnungen über Zeilen oder Spalten, Series.map() transformiert Werte und eine boolesche Maske filtert Zeilen. Der jeweilige Vorgang und seine Achse bestimmen, welche Eingabe lambda erhält und was zurückgegeben wird.
Was eine lambda-Funktion in pandas bewirkt
Ein Python-Ausdruck mit lambda erzeugt eine kleine anonyme Funktion mit einem einzelnen Ausdruck, etwa lambda value: value * 2. Er beschreibt eine Berechnung. Der pandas-Vorgang, dem diese Funktion übergeben wird, bestimmt, ob sie eine ganze Spalte, eine Zeile oder einen einzelnen Series-Wert erhält. Verwenden Sie eine benannte Funktion mit def, wenn die Logik mehrere Anweisungen umfasst, wiederverwendet werden soll oder ein aussagekräftiger Name hilfreich ist.
Abgeleitete Spalten mit DataFrame.assign() hinzufügen
DataFrame.assign() gibt ein DataFrame mit den angeforderten neuen oder ersetzten Spalten zurück. Das ursprüngliche DataFrame bleibt dabei unverändert. Eine als Argument übergebene Funktion erhält das DataFrame; ein einzelner Ausdruck kann daher auf eine oder mehrere vorhandene Spalten zugreifen. Zum Beispiel berechnet df.assign(percentage=lambda data: data["marks"] / 1000 * 100) einen Prozentwert, während df.assign(total=lambda data: data["math"] + data["science"]) zwei Spalten zusammenführt. Der Index des DataFrame wird für die neue Spalte übernommen.
Eine Funktion mit DataFrame.apply() auf Zeilen oder Spalten anwenden
DataFrame.apply() übergibt standardmäßig jede Spalte an die Funktion: axis=0 wendet sie auf Spalten an, während axis=1 sie für jede Zeile ausführt. Für eine Berechnung pro Zeile, etwa das Addieren der Werte base und bonus, schreiben Sie df.apply(lambda row: row["base"] + row["bonus"], axis=1). Welches Objekt zurückgegeben wird, hängt vom Rückgabewert der Funktion ab; ein einzelner Skalar pro Zeile ergibt eine Series. Für einfache Berechnungen auf einer Spalte sind vektorisierte pandas-Operationen meist klarer und schneller als ein Python-Aufruf pro Zeile.
Werte in einer Series abbilden oder filtern
Pythons integrierte Funktion map(function, values) transformiert jeden Eingabewert und gibt einen Iterator zurück. Mit list(...) lassen sich die Ergebnisse als Liste materialisieren. Das pandas-Gegenstück Series.map(function) gibt eine Series zurück, deren Werte am ursprünglichen Index ausgerichtet sind. Zum Beispiel erzeugt df["age"].map(lambda age: age + 1) um eins erhöhte Werte. Das DataFrame wird dadurch erst geändert, wenn Sie das Ergebnis zuweisen.
Pythons integrierte Funktion filter(predicate, values) behält Eingabewerte, für die das Prädikat wahr ist, und gibt einen Iterator zurück. Beim Filtern eines pandas-DataFrame ist eine boolesche Maske direkter und behält passende Zeilen samt ihrer übrigen Spalten bei: df[df["age"] < 25]. Eine Series lässt sich auch mit df["age"][df["age"] < 25] filtern. Die Ergebnisse unterscheiden sich: filter auf einer Series liefert Werte, eine Maske auf einem DataFrame wählt vollständige Zeilen aus.
Bedingte Logik mit lambda anwenden
Ein bedingter Ausdruck passt in den einzelnen Ausdruck einer lambda-Funktion: lambda income: "Stable" if income >= 5000 else "Unstable". Wird er auf eine Series angewendet, entsteht für jedes Einkommen eine Bezeichnung. Der Grenzwert gilt einschließlich: Bei 5000 lautet das Ergebnis Stable, bei niedrigeren Werten Unstable. Für ein ganzes DataFrame können Sie das Ergebnis einer Spalte zuweisen, zum Beispiel mit df["category"] = df["income"].apply(lambda income: "Stable" if income >= 5000 else "Unstable"). Die im unveränderten Beispielcode verwendeten Bezeichnungen Stable und Unstable bleiben auf Englisch.
Eine Vorgehensweise auswählen und das Ergebnis prüfen
Verwenden Sie assign(), um Spalten hinzuzufügen, apply(), wenn eine Funktion jede Zeile oder Spalte verarbeiten soll, Series.map(), um einzelne Werte umzuwandeln, und eine boolesche Maske, um passende Zeilen auszuwählen. Prüfen Sie vor der Zuweisung die Achse, die Eingabe der lambda und ob das Ergebnis eine Series oder ein DataFrame ist. Das folgende eigenständige Beispiel zeigt diese Vorgehensweisen anhand zusammengehöriger Daten:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import pandas as pd
df = pd.DataFrame({"name": ["Ari", "Bea", "Cal"], "math": [80, 92, 75], "science": [85, 88, 90], "income": [4000, 6000, 5000]})
result = df.assign(
total=lambda data: data["math"] + data["science"],
next_income=lambda data: data["income"].map(lambda value: value + 1000),
category=lambda data: data["income"].apply(lambda value: "Stable" if value >= 5000 else "Unstable"),
)
selected = result[result["total"] >= 170]
print(selected[["name", "total", "next_income", "category"]].to_string(index=False))