Pandas-GroupBy-Operationen (groupby)
groupbyEs ist eine der leistungsstärksten Funktionen von Pandas: Damit können Sie Daten nach einer oder mehreren Spalten gruppieren und dann Aggregations-, Transformations- oder Filteroperationen für jede Gruppe ausführen.
Grundlegende Verwendung von groupby
Gruppierung nach einer einzelnen Spalte
Beispiel
import pandas as pd
# Beispieldaten erstellen
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Betrieb", "Vertrieb", "Technologie"],
"Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi", "Sun Ba"],
"Salary": [12000, 15000, 11000, 18000, 14000, 13000]
})
print("Originaldaten:")
print(df)
print()
# Nach Abteilung gruppieren
grouped = df.groupby("Department")
print(f"Gruppiertes Objekt: {type(grouped)}")
print(f"Anzahl der Gruppen: {len(grouped)}")
print()
# Die Gruppen anzeigen
print("Daten für jede Gruppe:")
for name, group in grouped:
print(f"\nAbteilung: {name}")
print(group)
# Beispieldaten erstellen
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Betrieb", "Vertrieb", "Technologie"],
"Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi", "Sun Ba"],
"Salary": [12000, 15000, 11000, 18000, 14000, 13000]
})
print("Originaldaten:")
print(df)
print()
# Nach Abteilung gruppieren
grouped = df.groupby("Department")
print(f"Gruppiertes Objekt: {type(grouped)}")
print(f"Anzahl der Gruppen: {len(grouped)}")
print()
# Die Gruppen anzeigen
print("Daten für jede Gruppe:")
for name, group in grouped:
print(f"\nAbteilung: {name}")
print(group)
Gruppieren und Aggregieren
Beispiel
import pandas as pd
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Operations", "Sales"],
"Salary": [12000, 15000, 11000, 18000, 14000]
})
print("Durchschnittliches Gehalt nach Abteilung:")
print(df.groupby("Department")["Salary"].mean())
print()
print("Summe nach Abteilung:")
print(df.groupby("Department")["Salary"].sum())
print()
print("Anzahl nach Abteilung:")
print(df.groupby("Department").size())
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Operations", "Sales"],
"Salary": [12000, 15000, 11000, 18000, 14000]
})
print("Durchschnittliches Gehalt nach Abteilung:")
print(df.groupby("Department")["Salary"].mean())
print()
print("Summe nach Abteilung:")
print(df.groupby("Department")["Salary"].sum())
print()
print("Anzahl nach Abteilung:")
print(df.groupby("Department").size())
Gruppierung nach mehreren Spalten
Beispiel
import pandas as pd
df = pd.DataFrame({
"Year": ["2023", "2023", "2024", "2024"],
"Department": ["Technology", "Sales", "Technology", "Verkäufe"],
"Salary": [12000, 15000, 13000, 16000]
})
print("Nach Jahr und Abteilung gruppieren:")
print(df.groupby(["Year", "Department"])["Salary"].sum())
print()
# Ausgabe als DataFrame
result = df.groupby(["Year", "Department"]).agg({
"Salary": "sum"
}).reset_index()
print("Ergebnis-DataFrame:")
print(result)
df = pd.DataFrame({
"Year": ["2023", "2023", "2024", "2024"],
"Department": ["Technology", "Sales", "Technology", "Verkäufe"],
"Salary": [12000, 15000, 13000, 16000]
})
print("Nach Jahr und Abteilung gruppieren:")
print(df.groupby(["Year", "Department"])["Salary"].sum())
print()
# Ausgabe als DataFrame
result = df.groupby(["Year", "Department"]).agg({
"Salary": "sum"
}).reset_index()
print("Ergebnis-DataFrame:")
print(result)
Häufige Aggregationsfunktionen
Einzelaggregation
| Funktion | Beschreibung |
|---|---|
sum() |
Sum |
mean() |
Mittelwert |
median() |
Median |
std() |
Standardabweichung |
min() / max() |
Min/Max |
count() |
Count |
first() / last() |
Erster/Letzter Wert |
Beispiel
import pandas as pd
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Operations"],
"Salary": [12000, 15000, 11000, 18000]
})
# Mehrere Aggregationen verketten
print("Verkettete Aggregation:")
print(df.groupby("Department")["Salary"].agg(["sum", "mean", "max", "min"]))
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Operations"],
"Salary": [12000, 15000, 11000, 18000]
})
# Mehrere Aggregationen verketten
print("Verkettete Aggregation:")
print(df.groupby("Department")["Salary"].agg(["sum", "mean", "max", "min"]))
Benutzerdefinierte Aggregation
Beispiel
import pandas as pd
import numpy as np
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Operations"],
"Salary": [12000, 15000, 11000, 18000]
})
# Benutzerdefinierte Aggregationsfunktion
def range_func(x):
return x.max() - x.min()
print("Verwende eine benutzerdefinierte Funktion:")
print(df.groupby("Department")["Salary"].agg(range_func))
print()
# Benannte Aggregation (empfohlen)
print("Benannte Aggregation:")
print(df.groupby("Department").agg(
Mindestgehalt=("Salary", "min"),
Höchstgehalt=("Salary", "max"),
Durchschnittsgehalt=("Salary", "mean")
))
import numpy as np
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Operations"],
"Salary": [12000, 15000, 11000, 18000]
})
# Benutzerdefinierte Aggregationsfunktion
def range_func(x):
return x.max() - x.min()
print("Verwende eine benutzerdefinierte Funktion:")
print(df.groupby("Department")["Salary"].agg(range_func))
print()
# Benannte Aggregation (empfohlen)
print("Benannte Aggregation:")
print(df.groupby("Department").agg(
Mindestgehalt=("Salary", "min"),
Höchstgehalt=("Salary", "max"),
Durchschnittsgehalt=("Salary", "mean")
))
transform
transform kann für jede Gruppe berechnen, während die ursprüngliche Datenform beibehalten wird, und ein Ergebnis mit derselben Form wie die ursprünglichen Daten zurückgeben.
Beispiel
import pandas as pd
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Operations", "Sales"],
"Salary": [12000, 15000, 11000, 18000, 14000]
})
print("Originaldaten:")
print(df)
print()
# Berechne das durchschnittliche Gehalt für jede Abteilung und übertrage es auf jede Zeile
df["Department average salary"] = df.groupby("Department")["Salary"].transform("mean")
print("Nach dem Hinzufügen des Abteilungsdurchschnittsgehalts:")
print(df)
print()
# Berechne das Gehalt jeder Person als Prozentsatz der Abteilung
df["Salary percentage"] = df["Salary"] / df["Department average salary"]
print("Gehaltsanteil:")
print(df)
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Operations", "Sales"],
"Salary": [12000, 15000, 11000, 18000, 14000]
})
print("Originaldaten:")
print(df)
print()
# Berechne das durchschnittliche Gehalt für jede Abteilung und übertrage es auf jede Zeile
df["Department average salary"] = df.groupby("Department")["Salary"].transform("mean")
print("Nach dem Hinzufügen des Abteilungsdurchschnittsgehalts:")
print(df)
print()
# Berechne das Gehalt jeder Person als Prozentsatz der Abteilung
df["Salary percentage"] = df["Salary"] / df["Department average salary"]
print("Gehaltsanteil:")
print(df)
filter Filterung
filter kann Daten basierend auf Gruppenbedingungen filtern.
Beispiel
import pandas as pd
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Betrieb", "Vertrieb", "Technologie"],
"Salary": [12000, 15000, 11000, 18000, 14000, 13000]
})
print("Originaldaten:")
print(df)
print()
# Abteilungen filtern, deren Durchschnittsgehalt größer als 13000 ist
print("Durchschnittsgehalt der Abteilung > 13000:")
filtered = df.groupby("Department").filter(lambda x: x["Salary"].mean() > 13000)
print(filtered)
print()
# Gruppen mit einer Anzahl größer als 2 filtern
print("Anzahl der Mitglieder > 2:")
filtered2 = df.groupby("Department").filter(lambda x: len(x) > 2)
print(filtered2)
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Betrieb", "Vertrieb", "Technologie"],
"Salary": [12000, 15000, 11000, 18000, 14000, 13000]
})
print("Originaldaten:")
print(df)
print()
# Abteilungen filtern, deren Durchschnittsgehalt größer als 13000 ist
print("Durchschnittsgehalt der Abteilung > 13000:")
filtered = df.groupby("Department").filter(lambda x: x["Salary"].mean() > 13000)
print(filtered)
print()
# Gruppen mit einer Anzahl größer als 2 filtern
print("Anzahl der Mitglieder > 2:")
filtered2 = df.groupby("Department").filter(lambda x: len(x) > 2)
print(filtered2)
apply Benutzerdefinierte Funktionen
apply ermöglicht das Anwenden benutzerdefinierter Funktionen auf jede Gruppe.
Beispiel
import pandas as pd
import numpy as np
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Operations"],
"Salary": [12000, 15000, 11000, 18000]
})
# Eine benutzerdefinierte Funktion auf jede Gruppe anwenden
result = df.groupby("Department").apply(
lambda x: pd.Series({
"Summe": x["Gehalt"].sum(),
"Mittelwert": x["Gehalt"].mean()
})
)
print("Ergebnis der benutzerdefinierten Aggregation:")
print(result)
import numpy as np
df = pd.DataFrame({
"Department": ["Technology", "Sales", "Technology", "Operations"],
"Salary": [12000, 15000, 11000, 18000]
})
# Eine benutzerdefinierte Funktion auf jede Gruppe anwenden
result = df.groupby("Department").apply(
lambda x: pd.Series({
"Summe": x["Gehalt"].sum(),
"Mittelwert": x["Gehalt"].mean()
})
)
print("Ergebnis der benutzerdefinierten Aggregation:")
print(result)
Praxisübung: Verkaufsdatenanalyse
Beispiel
import pandas as pd
# Verkaufsdaten simulieren
sales = pd.DataFrame({
"Date": pd.date_range("2024-01-01", periods=30, freq="D"),
"Produkt": ["Mobiltelefon", "Computer", "Tablet"] * 10,
"Kanal": ["Online"] * 15 + ["Offline"] * 15,
"Verkaufsbetrag": [1000, 2000, 1500] * 10
})
print("=== Verkaufsdatenanalyse ==="\n")
# 1. Statistik nach Produkt
print("1. Statistik nach Produkt:")
product_summary = sales.groupby("Produkt")["Verkaufsbetrag"].agg(["sum", "mean", "count"])
print(product_summary)
print()
# 2. Statistiken nach Kanal
print("2. Statistiken nach Kanal:")
channel_summary = sales.groupby("Channel")["Sales amount"].sum()
print(channel_summary)
print()
# 3. Kreuzstatistiken nach Produkt und Kanal
print("3. Produkt × Kanal Kreuzstatistiken:")
cross_summary = sales.groupby(["Product", "Channel"])["Sales amount"].sum().unstack()
print(cross_summary)
print()
# 4. Umsatzanteil für jedes Produkt berechnen
print("4. Umsatzanteil:")
total = sales["Sales amount"].sum()
product_pct = sales.groupby("Product")["Sales amount"].sum() / total * 100
print(product_pct.round(2))
# Verkaufsdaten simulieren
sales = pd.DataFrame({
"Date": pd.date_range("2024-01-01", periods=30, freq="D"),
"Produkt": ["Mobiltelefon", "Computer", "Tablet"] * 10,
"Kanal": ["Online"] * 15 + ["Offline"] * 15,
"Verkaufsbetrag": [1000, 2000, 1500] * 10
})
print("=== Verkaufsdatenanalyse ==="\n")
# 1. Statistik nach Produkt
print("1. Statistik nach Produkt:")
product_summary = sales.groupby("Produkt")["Verkaufsbetrag"].agg(["sum", "mean", "count"])
print(product_summary)
print()
# 2. Statistiken nach Kanal
print("2. Statistiken nach Kanal:")
channel_summary = sales.groupby("Channel")["Sales amount"].sum()
print(channel_summary)
print()
# 3. Kreuzstatistiken nach Produkt und Kanal
print("3. Produkt × Kanal Kreuzstatistiken:")
cross_summary = sales.groupby(["Product", "Channel"])["Sales amount"].sum().unstack()
print(cross_summary)
print()
# 4. Umsatzanteil für jedes Produkt berechnen
print("4. Umsatzanteil:")
total = sales["Sales amount"].sum()
product_pct = sales.groupby("Product")["Sales amount"].sum() / total * 100
print(product_pct.round(2))
Andere Erweiterungengroupby ist eine Kernoperation in der Datenanalyse; wer sie beherrscht, kann verschiedene statistische Analyseaufgaben effizient erledigen.