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)

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())

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)

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"]))

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")
))

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)

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)

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)

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))

groupby ist eine Kernoperation in der Datenanalyse; wer sie beherrscht, kann verschiedene statistische Analyseaufgaben effizient erledigen.

Andere Erweiterungen