Einführung
Pandas gehört zu den am häufigsten verwendeten Python-Bibliotheken für die Datenanalyse. Sie bietet einfache Werkzeuge zum Bereinigen, Umformen, Zusammenfassen und Erkunden strukturierter Daten. Eine der nützlichsten Funktionen in Pandas ist GroupBy. Diese Funktion hilft dabei, Fragen zu beantworten, die das Gruppieren von Zeilen nach einer oder mehreren Kategorien erfordern.
Wenn Sie beispielsweise mit Verkaufsdaten arbeiten, möchten Sie möglicherweise den Gesamtumsatz nach Region, den durchschnittlichen Bestellwert nach Produktkategorie oder die Anzahl der Bestellungen, die von jedem Verkaufsmitarbeiter bearbeitet wurden, berechnen. Anstatt jede Kategorie einzeln zu filtern, ermöglicht es GroupBy, diese Berechnungen auf eine saubere und effiziente Weise durchzuführen.
In diesem Tutorial werden wir praktische Beispiele für die Verwendung von Pandas GroupBy anhand eines kleinen Verkaufsdatensatzes durchgehen. Der Code wird in Deepnote ausgeführt, sodass einige Ausgaben als Screenshots direkt unter den Codeblöcken angezeigt werden.
Erstellen eines Beispiel-Datensatzes
Bevor wir GroupBy verwenden, erstellen wir zunächst einen kleinen Einzelhandelsverkaufsdatensatz mit Spalten wie order_id, region, category, sales_rep, units, unit_price, discount und order_date. Anschließend wandeln wir das Dictionary in ein Pandas DataFrame um und erstellen zwei neue Spalten: gross_sales und net_sales.
data = {
"order_id": [101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112],
"region": ["North", "South", "North", "West", "South", "West", "North", "South", "West", "North", "South", "West"],
"category": ["Electronics", "Furniture", "Electronics", "Furniture", "Clothing", "Electronics",
"Clothing", "Furniture", "Clothing", "Furniture", "Electronics", "Clothing"],
"sales_rep": ["Ayesha", "Bilal", "Ayesha", "Chen", "Bilal", "Chen",
"Ayesha", "Bilal", "Chen", "Ayesha", "Bilal", "Chen"],
"units": [2, 1, 3, 2, 5, 4, 6, 2, 7, 1, 2, 8],
"unit_price": [500, 800, 450, 700, 60, 550, 55, 850, 65, 750, 520, 70],
"discount": [0.05, 0.10, 0.00, 0.08, 0.00, 0.12, 0.05, 0.10, 0.00, 0.07, 0.03, 0.00],
"order_date": pd.to_datetime([
"2026-01-05", "2026-01-06", "2026-01-08", "2026-01-10",
"2026-01-12", "2026-01-15", "2026-02-02", "2026-02-05",
"2026-02-08", "2026-02-12", "2026-02-15", "2026-02-20"
])
}
df = pd.DataFrame(data)
df["gross_sales"] = df["units"] * df["unit_price"]
df["net_sales"] = df["gross_sales"] * (1 - df["discount"])
df
Die Spalte gross_sales wird berechnet, indem die Einheiten mit dem Stückpreis multipliziert werden, während net_sales diesen Wert nach Anwendung des Rabatts anpasst. Dies ergibt einen sauberen Datensatz, den wir für alle GroupBy-Beispiele verwenden können.
Verwendung der grundlegenden GroupBy-Syntax
Die grundlegendste GroupBy-Operation folgt einem einfachen Muster: Wählen Sie eine Gruppierungsspalte, wählen Sie die Wertspalte aus und wenden Sie eine Aggregationsfunktion an. In diesem Beispiel gruppieren wir die Daten nach Region und berechnen die gesamten net_sales für jede Region.
df.groupby("region")["net_sales"].sum()
Das Ergebnis zeigt, dass Nord, Süd und West jeweils ihren eigenen Gesamtumsatz haben. Dies ist der einfachste und häufigste Anwendungsfall für GroupBy, wenn es darum geht, Daten zusammenzufassen.
region
North 3311.0
South 3558.8
West 4239.0
Name: net_sales, dtype: float64
Verwendung von GroupBy mit as_index=false
Standardmäßig verwendet Pandas die gruppierte Spalte als Index in der Ausgabe. Während dies in einigen Fällen nützlich ist, ist es oft einfacher, mit einem normalen DataFrame zu arbeiten, in dem die gruppierte Spalte eine reguläre Spalte bleibt. Hier kommt as_index=false ins Spiel.
df.groupby("region", as_index=False)["net_sales"].sum()
In diesem Beispiel berechnen wir erneut die gesamten net_sales nach Region, aber das Ergebnis wird als sauberes DataFrame zurückgegeben, das einfacher zu exportieren, zusammenzuführen oder in Berichten zu verwenden ist.
Anwenden mehrerer Aggregationen auf eine Spalte
GroupBy ist nicht auf eine einzige Berechnung beschränkt. Sie können mehrere Aggregationsfunktionen auf dieselbe Spalte anwenden, indem Sie agg() verwenden.
In diesem Beispiel berechnen wir die Summe, den Durchschnitt, das Minimum, das Maximum und die Anzahl der net_sales für jede Region.
df.groupby("region")["net_sales"].agg(["sum", "mean", "min", "max", "count"])
Verwendung benannter Aggregationen
Benannte Aggregationen machen die Ausgaben von GroupBy leichter lesbar und verwendbar. Anstatt generische Spaltennamen wie sum oder mean zurückzugeben, definieren wir unsere eigenen Namen wie total_sales, average_order_value, total_units und number_of_orders.
Dies ist besonders hilfreich, wenn Analysen für Dashboards, Berichte oder Tutorials vorbereitet werden, da die Ausgabespaltennamen klar erklären, was jede Kennzahl darstellt.
region_summary = (
df.groupby("region", as_index=False)
.agg(
total_sales=("net_sales", "sum"),
average_order_value=("net_sales", "mean"),
total_units=("units", "sum"),
number_of_orders=("order_id", "count")
)
)
Gruppierung nach mehreren Spalten
Sie können Daten auch nach mehr als einer Spalte gruppieren. In diesem Beispiel gruppieren wir sowohl nach Region als auch nach Kategorie, um die gesamten net_sales für jede Produktkategorie innerhalb jeder Region zu berechnen.
df.groupby(["region", "category"], as_index=False)["net_sales"].sum()
Dies gibt uns eine detailliertere Sicht auf die Daten im Vergleich zur Gruppierung nur nach Region. Die Gruppierung nach mehreren Spalten ist nützlich, wenn Sie die Leistung über verschiedene Dimensionen hinweg analysieren möchten, wie Region und Produkt, Abteilung und Mitarbeiter oder Monat und Kundensegment.
Sortieren der GroupBy-Ergebnisse
Nach dem Gruppieren und Aggregieren von Daten möchten Sie häufig die Ergebnisse sortieren, um die höchsten oder niedrigsten Werte zu finden.
In diesem Beispiel berechnen wir die Gesamteinnahmen nach Produktkategorie und sortieren die Ergebnisse dann in absteigender Reihenfolge.
category_sales = (
df.groupby("category", as_index=False)
.agg(total_sales=("net_sales", "sum"))
.sort_values("total_sales", ascending=False)
)
Verstehen von Count vs Size
Pandas bietet sowohl count() als auch size(), aber sie sind nicht genau dasselbe. Die size()-Methode zählt die Gesamtzahl der Zeilen in jeder Gruppe, einschließlich der Zeilen mit fehlenden Werten. Die count()-Methode zählt nur die nicht fehlenden Werte in einer ausgewählten Spalte.
In diesem Beispiel fügen wir absichtlich einen fehlenden Wert in die sales_rep-Spalte ein. Die Ausgabe zeigt, dass size() immer noch vier Zeilen für jede Region zählt, während count() drei für Nord zurückgibt, da ein Wert für sales_rep fehlt.
import numpy as np
df_missing = df.copy()
df_missing.loc[2, "sales_rep"] = np.nan
print("Using size():")
display(df_missing.groupby("region").size())
print("Using count() on sales_rep:")
display(df_missing.groupby("region")["sales_rep"].count())
Verwendung von transform() für gruppenbezogene Merkmale
Die transform()-Methode ist nützlich, wenn Sie einen gruppenbezogenen Wert berechnen und ihn wieder in das ursprüngliche DataFrame einfügen möchten.
In diesem Beispiel berechnen wir die Gesamteinnahmen für jede Region und speichern sie in einer neuen Spalte namens region_total_sales.
df["region_total_sales"] = df.groupby("region")["net_sales"].transform("sum")
df["order_share_of_region"] = df["net_sales"] / df["region_total_sales"]
df[["order_id", "region", "net_sales", "region_total_sales", "order_share_of_region"]]
Filtern von Gruppen mit filter()
Die filter()-Methode ermöglicht es Ihnen, ganze Gruppen basierend auf einer Bedingung zu behalten oder zu entfernen. In diesem Beispiel behalten wir nur die Regionen, in denen die gesamten net_sales über 3.000 liegen.
high_sales_regions = df.groupby("region").filter(lambda group: group["net_sales"].sum() > 3000)
high_sales_regions
Anwenden benutzerdefinierter Logik mit apply()
Die apply()-Methode bietet Ihnen mehr Flexibilität, da sie es Ihnen ermöglicht, benutzerdefinierte Logik auf jede Gruppe anzuwenden.
In diesem Beispiel verwenden wir apply() mit nlargest(), um die größte Bestellung nach net_sales in jeder Region zu finden. Dies ist nützlich, wenn die integrierten Aggregationsfunktionen für Ihre Analyse nicht ausreichen.
top_order_by_region = (
df.groupby("region", group_keys=False)
.apply(lambda group: group.nlargest(1, "net_sales"))
)
Gruppierung nach Daten
GroupBy ist auch sehr nützlich für zeitbasierte Analysen.
In diesem Beispiel extrahieren wir den Monat aus der order_date-Spalte und gruppieren die Daten nach Monat.
df["month"] = df["order_date"].dt.to_period("M").astype(str)
monthly_sales = (
df.groupby("month", as_index=False)
.agg(total_sales=("net_sales", "sum"), total_orders=("order_id", "count"))
)
Gruppierung nach Daten mit pd.Grouper
pd.Grouper bietet eine sauberere Möglichkeit, Zeitreihendaten zu gruppieren, ohne manuell eine separate Monatsspalte zu erstellen.
monthly_sales_grouper = (
df.groupby(pd.Grouper(key="order_date", freq="M"))
.agg(total_sales=("net_sales", "sum"), total_orders=("order_id", "count"))
.reset_index()
)
Erstellen einer Pivot-ähnlichen Zusammenfassung mit GroupBy
Sie können groupby() mit unstack() kombinieren, um eine Pivot-ähnliche Zusammenfassungstabelle zu erstellen.
region_category_table = (
df.groupby(["region", "category"]) ["net_sales"]
.sum()
.unstack(fill_value=0)
)
Fazit
Pandas GroupBy ist eines der leistungsstärksten Werkzeuge für die Datenanalyse in Python. Es hilft Ihnen, Daten zusammenzufassen, Gruppen zu vergleichen, neue Merkmale zu erstellen, Ergebnisse zu filtern und benutzerdefinierte Berechnungen anzuwenden, ohne unnötige manuelle Logik zu schreiben.
Während der Arbeit an diesem Tutorial wurde mir bewusst, wie viel Tiefe in GroupBy steckt. Selbst nach jahrelanger Arbeit mit Daten habe ich neue und bessere Wege gelernt, um häufige Probleme zu lösen. Funktionen wie pd.Grouper, benutzerdefinierte Aggregationsfunktionen und transform() stachen hervor, da sie viele Aufgaben schneller, sauberer und einfacher wartbar machen.
Das ist auch der Grund, warum das Verständnis der nativen Werkzeuge wichtig ist. Es ist verlockend, sich auf schnelles Programmieren oder schnelle benutzerdefinierte Lösungen zu verlassen, aber diese können oft zu langsamerem, komplizierterem Code führen. Wenn Sie wissen, was Pandas bereits bietet, können Sie Lösungen schreiben, die effizienter, wiederverwendbar und praktikabel für die Datenanalyse in der realen Welt sind.
In diesem Tutorial haben wir die nützlichsten GroupBy-Operationen behandelt, einschließlich grundlegender Aggregation, benannter Aggregation, Gruppierung nach mehreren Spalten, Sortierung, count() vs size(), transform(), filter(), apply(), Gruppierung nach Datum und Pivot-ähnliche Zusammenfassungen. Sobald Sie diese Muster verstanden haben, können Sie GroupBy verwenden, um viele Fragen der Datenanalyse in der realen Welt schnell und sicher zu beantworten.
Für weitere Informationen über Wie die Struktur von Datensätzen den Programmierstil beeinflusst und Effiziente Python-Skripte zur Automatisierung der explorativen Datenanalyse sowie 5 Powerful Python Decorators for High-Performance Data Pipelines können Sie die Links am Ende des Artikels nutzen.
„`
Quellen: kdnuggets
Bildquelle: KI generiert