Pandas df.groupby()-Funktion

Gängige Pandas-Funktionen


groupby()Es ist eine der leistungsstärksten Gruppierungsfunktionen in Pandas. Sie ermöglicht es Ihnen, Daten anhand der Werte einer oder mehrerer Spalten in verschiedene Gruppen aufzuteilen und dann verschiedene Operationen auf jede Gruppe anzuwenden.

Einfach ausgedrückt,groupby()Sie implementiert den"Split-Apply-Combine"(Split-Apply-Combine)-Workflow: zuerst werden die Daten nach Bedingungen aufgeteilt, dann wird die entsprechende Funktion auf jede Gruppe angewendet und schließlich werden die Ergebnisse kombiniert.

Dies ist in der Datenanalyse sehr verbreitet, z. B. die Berechnung des durchschnittlichen Gehalts von Mitarbeitern nach Abteilung, die Summierung von Verkäufen nach Monat und das Zählen von Benutzern nach Region.


Grundlegende Syntax und Parameter

groupby()Es ist eine Memberfunktion von DataFrame, die über den Punktoperator.aufgerufen wird. Nach dem Aufruf gibt sie einGroupByObjekt zurück. Dieses Objekt zeigt Ergebnisse nicht direkt an; es muss zusammen mit Aggregationsfunktionen verwendet werden.

Syntaxformat

DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, dropna=True)

Parameterbeschreibung

Parameter Type Beschreibung Standardwert
von str, list oder dict Der Spaltenname oder die Liste der Spaltennamen, die für die Gruppierung verwendet werden. Wenn es sich um ein Wörterbuch oder eine Funktion handelt, basiert die Gruppierung auf deren Ergebnissen. Keine
axis int Die Achsenrichtung für die Gruppierung; 0 bedeutet zeilenweise (Standard), 1 bedeutet spaltenweise. 0
level int oder str Wenn es sich um einen MultiIndex handelt, gruppieren Sie nach der angegebenen Ebene. Keine
as_index bool Wenn True, werden die Gruppierungsspalten als Index des zurückgegebenen Ergebnisses verwendet; wenn False, werden die Gruppierungsspalten als normale Spalten beibehalten. True
sortieren bool Ob die Gruppenbezeichnungen sortiert werden sollen. Das Setzen auf False kann die Leistung verbessern. True
group_keys bool Beim Aufrufapply()ob die Gruppierungsschlüssel als Index im Ergebnis hinzugefügt werden. True
observed bool Wenn True, werden nur die tatsächlich beobachteten Werte kategorialer Variablen angezeigt statt aller möglichen Werte. False
dropna bool Wenn True, werden Gruppen, die NA/null-Werte enthalten, verworfen. True

Rückgabewert

  • Rückgabetyp:DataFrameGroupByoderSeriesGroupByObjekt
  • Beschreibung: Es gibt ein Gruppierungsobjekt zurück, nicht das Endergebnis. Sie müssen eine Aggregationsfunktion aufrufen (wie z. B.sum()、mean()、count()usw.), um das spezifische Berechnungsergebnis zu erhalten.

Beispiele

Lassen Sie uns ... durch eine Reihe von Beispielen von einfach bis komplex gründlich meisterngroupby()die Verwendung von df.groupby().

Beispiel 1: Gruppierung nach einer einzelnen Spalte

Die grundlegendste Verwendung besteht darin, nach den Werten einer einzelnen Spalte zu gruppieren. Angenommen, wir haben eine Tabelle mit Verkaufsdaten und müssen den Gesamtumsatz nach Region berechnen.

Beispiel

import pandas as pd

# Ein einfaches DataFrame mit Verkaufsdaten erstellen
# Eine Tabelle mit Region, Produkt und Verkaufsbetrag simulieren
data = {
    'Region': ['North', 'East', 'South', 'North', 'East', 'South', 'North', 'East'],
    'Product': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
    'Sales': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100]
}

# DataFrame erstellen
df = pd.DataFrame(data)

print("Originaldaten:")
print(df)
print()

# Nach der Spalte 'Region' gruppieren und den Gesamtumsatz für jede Region berechnen
# as_index=True bedeutet, dass die Region als Index zurückgegeben wird
grouped = df.groupby('Region', as_index=True)['Sales'].sum()

print("Gesamte Verkäufe nach der Gruppierung nach Region:")
print(grouped)
print()

# Wenn as_index=False, wird die Gruppierungsspalte als gewöhnliche Spalte beibehalten
grouped_df = df.groupby('Region', as_index=False)['Sales'].sum()

print("Ergebnis bei as_index=False:")
print(grouped_df)

Erwartete Ausgabe:

原始数据:
  地区  产品   销售额
0  华东   B   2000
1  华南   C   1500
2  华北   A   1000
3  华东   B   1800
4  华南   C   2200
5  华北   A   1600
6  华东   A   1200
7  华南   B   2100

按地区分组后的总销售额:
地区
华东    7100
华南    7300
华北    3600
dtype: int64

as_index=False 时的结果:
   地区    销售额
0  华东    7100
1  华南    7300
2  华北    3600

Codeanalyse:

  1. df.groupby('地区')Die Daten werden anhand der Werte in der Spalte 'Region' in drei Gruppen aufgeteilt: East, South, North.
  2. ['销售额'].sum()Das bedeutet, dass nur die Spalte 'Sales' durch Summenbildung aggregiert wird.
  3. as_index=True(Standardwert) gibt eine Series mit der Region als Index zurück;as_index=FalseWenn ..., behält das zurückgegebene DataFrame die Region als gewöhnliche Spalte bei, was für die weitere Verarbeitung besser geeignet ist.

Beispiel 2: Gruppierung nach mehreren Spalten

Manchmal muss man gleichzeitig nach mehreren Spalten gruppieren, z. B. nach Region und Produkt, um den Umsatz zu berechnen.

Beispiel

import pandas as pd

# Umsatzdaten erstellen
data = {
    'Region': ['North', 'East', 'South', 'North', 'East', 'South', 'North', 'East'],
    'Product': ['A', 'B', 'C', 'B', 'A', 'C', 'A', 'B'],
    'Sales': [1000, 2000, 1500, 1800, 2200, 1600, 1200, 2100]
}
df = pd.DataFrame(data)

print("Originaldaten:")
print(df)
print()

# Nach den Spalten 'Region' und 'Product' gruppieren, um den Gesamtumsatz zu berechnen
# Eine Liste verwenden, um mehrere Gruppierungsspalten anzugeben
grouped = df.groupby(['Region', 'Product'], as_index=False)['Sales'].sum()

print("Gesamtumsatz nach Gruppierung nach Region und Produkt:")
print(grouped)
print()

# pivot_table verwenden, um die Ergebnisse intuitiver anzuzeigen
pivot = df.pivot_table(values='Sales', index='Region', columns='Product', aggfunc='sum', fill_value=0)
print("Angezeigt mit pivot_table:")
print(pivot)

Erwartete Ausgabe:

原始数据:
  地区  产品   销售额
0  华北   A   1000
1  华东   B   2000
2  华南   C   1500
3  华北   B   1800
4  华东   A   2200
5  华南   C   1600
6  华北   A   1200
7  华东   B   2100

按地区和产品分组后的总销售额:
   地区  产品   销售额
0  华东   A   2200
1  华东   B   4100
2  华南   C   3100
3  华北   A   2200
4  华北   B   1800

使用 pivot_table 展示:
产品      A     B     C
地区
华北   2200  1800     0
华东   2200  4100     0
华南      0     0  3100

Codeanalyse:

  • ['Region', 'Product']Die Verwendung einer Liste ermöglicht die gleichzeitige Gruppierung nach mehreren Spalten, und das Ergebnis erzeugt einen mehrstufigen Index.
  • as_index=FalseWenn ..., werden die Gruppierungsspalten im Ergebnis als normale Spalten beibehalten, was die Anzeige und die anschließende Verarbeitung erleichtert.
  • pivot_table()Es bietet eine ähnliche Kreuztabellenfunktion und stellt die Gruppierungsergebnisse intuitiver dar.

Beispiel 3: Gruppierung mit Wörterbüchern und Funktionen

groupby()Zusätzlich zur Gruppierung nach Spaltennamen können Sie Gruppierungsregeln auch über Wörterbücher oder Funktionen definieren, was sehr nützlich ist, wenn Sie eine benutzerdefinierte Gruppierungslogik benötigen.

Beispiel

import pandas as pd

# Schüler-Notendaten erstellen
data = {
    'Name': ['Zhang San', 'Li Si', 'Wang Wu', 'Zhao Liu', 'Sun Qi', 'Zhou Ba'],
    'Chinesisch': [85, 92, 78, 88, 95, 82],
    'Mathematik': [90, 85, 92, 78, 88, 91],
    'Englisch': [88, 90, 85, 92, 87, 89]
}
df = pd.DataFrame(data)

print("Ursprüngliche Schüler-Notendaten:")
print(df)
print()

# 1. Verwenden Sie ein Wörterbuch für benutzerdefinierte Gruppierung
# Angenommen, wir möchten nach "surname" gruppieren (Zhang, Li, Wang als eine Gruppe, Zhao, Sun, Zhou als eine andere Gruppe)
def get_surname_group(name):
    """Gibt den Gruppennamen basierend auf dem Nachnamen zurück"""
    if name in ['Zhang San', 'Li Si', 'Wang Wu']:
        return 'Gruppe 1'
    else:
        return 'Gruppe 2'

# Verwenden Sie die apply-Funktion zum Gruppieren
grouped = df.groupby(get_surname_group).mean(numeric_only=True)
print("Verwenden Sie eine Funktion, um eine benutzerdefinierte Gruppierung zu definieren (durchschnittliche Punktzahl jeder Gruppe berechnen):")
print(grouped)
print()

# 2. Verwenden Sie ein Wörterbuch, um die Gruppierung für eine bestimmte Spalte zuzuordnen
# Teilen Sie die Chinesisch-Punkte basierend auf numerischen Intervallen in die Gruppen "Ausgezeichnet" und "Gut" ein
score_mapping = {
    'Chinese': lambda x: 'Excellent' if x >= 90 else 'Good'
}

# Spalte Chinese nach Bedingung gruppieren
grouped_by_score = df.groupby(lambda x: 'Excellent' if df.loc[x, 'Chinese'] >= 90 else 'Good').mean(numeric_only=True)
print("Gruppieren nach Chinese-Punktzahl (>=90 ist Excellent):")
print(grouped_by_score)

Erwartete Ausgabe:

原始学生成绩数据:
   姓名  语文  数学  英语
0  张三   85   90   88
1  李四   92   85   90
2  王五   78   92   85
3  赵六   88   78   92
4  孙七   95   88   87
5  周八   82   91   89

使用函数自定义分组(计算每组平均分):
              语文     数学     英语
姓名
第一组  85.000000  89.000000  87.666667
第二组  88.333333  85.666667  89.333333

按语文成绩分组(>=90为优秀):
              语文     数学     英语
语文
优秀   93.500000  86.500000  88.500000
良好   83.250000  89.500000  88.750000

Codeanalyse:

  • Die Gruppierung mit benutzerdefinierten Funktionen kann komplexe Gruppierungslogik bewältigen; sie benötigt nur, dass die Funktion einen Wert für die Gruppierung zurückgibt.
  • Verwendungnumeric_only=TrueDer Parameter kann die Aggregation auf numerische Spalten beschränken und so Fehler bei der Arbeit mit nicht-numerischen Spalten (z. B. Namen) vermeiden.
  • Durch Dictionary-Mapping können Sie die Anforderung umsetzen, "verschiedene Spalten basierend auf Bedingungen in unterschiedliche Gruppen einzuteilen".

Beispiel 4: Iterieren über Gruppen nach der Gruppierung

Manchmal müssen wir komplexere benutzerdefinierte Operationen für jede Gruppe ausführen; in diesem Fall können wir über die Gruppenobjekte iterieren.

Beispiel

import pandas as pd

# Umsatzdaten erstellen
data = {
    'Region': ['North', 'East', 'South', 'North', 'East', 'South'],
    'Product': ['A', 'B', 'C', 'B', 'A', 'C'],
    'Sales amount': [1000, 2000, 1500, 1800, 2200, 1600]
}
df = pd.DataFrame(data)

print("Rohdaten:")
print(df)
print()

# Über jede Gruppe zur Verarbeitung iterieren
print("Detaillierte Informationen für jede Gruppe:")
print("-" * 40)

for group_name, group_data in df.groupby('Region'):
    print(f"nGruppenname: {group_name}")
    print(f"Anzahl der Zeilen in dieser Gruppe: {len(group_data)}")
    print(f"Gesamtumsatz für diese Gruppe: {group_data['Sales amount'].sum()}")
    print(f"Durchschnittlicher Umsatz für diese Gruppe: {group_data['Sales amount'].mean():.2f}")
    print("-" * 40)

Erwartete Ausgabe:

原始数据:
  地区  产品   销售额
0  华东   B   2000
1  华南   C   1500
2  华北   A   1000
3  华东   B   1800
4  华南   C   2200
5  华北   B   1800

每个分组的详细信息:
----------------------------------------

分组名称: 华东
该组数据行数: 2
该组销售总额: 3800
该组平均销售额: 1900.00
----------------------------------------

分组名称: 华南
该组数据行数: 2
3700
1850.00
----------------------------------------

分组名称: 华北
该组数据行数: 2
2800
1400.00
----------------------------------------

Code-Erklärung:

  • groupby()Das zurückgegebene gruppierte Objekt kann direkt iteriert werden; jede Iteration liefert ein Tupel: (Gruppenname, Daten dieser Gruppe).
  • Auf diese Weise können Sie beliebig komplexe benutzerdefinierte Operationen auf jeder Gruppe ausführen.
  • In der Praxis wird diese Methode häufig verwendet, um komplexe Berichte zu erstellen oder Datenbereinigung durchzuführen.

Tipp:groupby()Das zurückgegebene GroupBy-Objekt wird "verzögert ausgeführt" und berechnet Ergebnisse nicht sofort. Erst beim Aufruf von Aggregationsfunktionen (wiesum()、mean()、count()usw.) oder beim Iterieren wird die eigentliche Berechnung durchgeführt.


Häufige Pandas-Funktionen

Weitere Erweiterungen