pivot_table
mit spezifischen aggfunc
s
Für einen DataFrame mit aggregierten Statistiken kann auch pivot_table
verwendet werden. Es erzeugt eine Tabelle, die nicht ganz unähnlich einer Excel-Pivot-Tabelle ist. Die Grundidee ist, die zu aggregerenden Spalten als values=
sowie die Gruppierungs-Spalten als index=
und die Aggregationsfunktionen als aggfunc=
(alle optimierten Funktionen, die für groupby.agg
zulässig sind, sind OK) zu übergeben.
Ein Vorteil von pivot_table
gegenüber groupby.agg
ist, dass es für mehrere Spalten eine einzelne size
-Spalte erzeugt, während groupby.agg
eine size
-Spalte für jede Spalte erzeugt (bis auf eine sind alle überflüssig).
agg_df = df.pivot_table(
values=['col3', 'col4', 'col5'],
index=['col1', 'col2'],
aggfunc=['size', 'mean', 'median']
).reset_index()
# Flachmachen der MultiIndex-Spalte (sollte ausgelassen werden, wenn MultiIndex bevorzugt wird)
agg_df.columns = [i if not j else f"{j}_{i}" for i,j in agg_df.columns]
![res1]()
Benutzung von benannter Aggregation für benutzerdefinierte Spaltennamen
Statt mehrerer rename
-Aufrufe für benutzerdefinierte Spaltennamen, verwende von Anfang an benannte Aggregation.
Aus den Dokumenten:
Um die aggregierte Datanbankunterstützung mit Kontrolle über die Ausgabespaltennamen zu unterstützen, akzeptiert pandas die spezielle Syntax in GroupBy.agg(), bekannt als "benannte Aggregation", bei der
- Die Schlüsselwörter die Ausgabespaltennamen sind
- Die Werte sind Tupel, deren erstes Element die auszuwählende Spalte und das zweite Element die anzuwendende Aggregation sind. pandas bietet das pandas.NamedAgg namedtuple mit den Feldern ['column', 'aggfunc'] an, um klarer zu machen, was die Argumente sind. Wie üblich kann die Aggregation ein Aufruf oder ein Alias als String sein.
Ein Beispiel wäre, um einen aggregierten DataFrame zu erstellen, in dem jeweils der Mittelwert und die Anzahl von col3
, col4
und col5
berechnet werden, könnte der folgende Code verwendet werden. Beachte, dass die Umbenennung der Spalten als Teil von groupby.agg
durchgeführt wird.
aggfuncs = {f'{c}_{f}': (c, f) for c in ['col3', 'col4', 'col5'] for f in ['mean', 'count']}
agg_df = df.groupby(['col1', 'col2'], as_index=False).agg(**aggfuncs)
![res3]()
Ein weiteres Anwendungsbeispiel von benannter Aggregation besteht darin, wenn jede Spalte eine andere Aggregationsfunktion benötigt. Zum Beispiel, wenn nur der Durchschnitt von col3
, der Median von col4
und das Minimum von col5
mit benutzerdefinierten Spaltennamen benötigt werden, kann dies mit dem folgenden Code durchgeführt werden.
agg_df = df.groupby(['col1', 'col2'], as_index=False).agg(col3_mean=('col3', 'mean'), col4_median=('col4', 'median'), col5_min=('col5', 'min'))
# oder äquivalent,
agg_df = df.groupby(['col1', 'col2'], as_index=False).agg(**{'_'.join(p): p for p in [('col3', 'mean'), ('col4', 'median'), ('col5', 'min')]})
![res2]()