Pivot-Tabellen und Kreuztabellen¶
Eine Pivot-Tabelle ist ein Werkzeug zur Datenzusammenfassung, das häufig in Tabellenkalkulationsprogrammen und anderer Datenanalysesoftware zu finden ist. Sie fasst eine Tabelle mit Daten nach einem oder mehreren Schlüsseln zusammen und ordnet die Daten in einem Rechteck an, wobei einige der Gruppenschlüssel entlang der Zeilen und einige entlang der Spalten angeordnet sind. Pivot-Tabellen in Python mit pandas werden durch die
groupby-Funktion in Kombination mit Umformungsoperationen unter Verwendung hierarchischer Indizierung ermöglicht. DataFrame hat eine pivot_table-Methode, und es gibt auch eine Top-Level-Funktion pandas.pivot_table. pivot_table
bietet nicht nur eine bequeme
Schnittstelle zu groupby
, sondern kann auch Teilsummen (margins
) hinzufügen.
Nehmen wir an, wir wollten eine Tabelle mit Gruppenmittelwerten (der Standardaggregationstyp von pivot_table
) berechnen, die nach Titel und Sprache in den Zeilen geordnet ist:
[1]:
import numpy as np
import pandas as pd
[2]:
df = pd.DataFrame(
{
"Title": [
"Jupyter Tutorial",
"Jupyter Tutorial",
"PyViz Tutorial",
"PyViz Tutorial",
"Python Basics",
"Python Basics",
],
"Language": ["de", "en", "de", "en", "de", "en"],
"2021-12": [30134, 6073, 4873, np.nan, 427, 95],
"2022-01": [33295, 7716, 3930, np.nan, 276, 226],
"2022-02": [19651, 6547, 2573, np.nan, 525, 157],
}
)
df
[2]:
Title | Language | 2021-12 | 2022-01 | 2022-02 | |
---|---|---|---|---|---|
0 | Jupyter Tutorial | de | 30134.0 | 33295.0 | 19651.0 |
1 | Jupyter Tutorial | en | 6073.0 | 7716.0 | 6547.0 |
2 | PyViz Tutorial | de | 4873.0 | 3930.0 | 2573.0 |
3 | PyViz Tutorial | en | NaN | NaN | NaN |
4 | Python Basics | de | 427.0 | 276.0 | 525.0 |
5 | Python Basics | en | 95.0 | 226.0 | 157.0 |
[3]:
df.pivot_table(index=["Title", "Language"])
[3]:
2021-12 | 2022-01 | 2022-02 | ||
---|---|---|---|---|
Title | Language | |||
Jupyter Tutorial | de | 30134.0 | 33295.0 | 19651.0 |
en | 6073.0 | 7716.0 | 6547.0 | |
PyViz Tutorial | de | 4873.0 | 3930.0 | 2573.0 |
Python Basics | de | 427.0 | 276.0 | 525.0 |
en | 95.0 | 226.0 | 157.0 |
Das hätte man auch direkt mit groupby
machen können.
Nehmen wir nun an, wir wollen den Durchschnitt jeden Monats nehmen und zusätzlich nach Title
gruppieren. Ich werde Title
und Language
in die Tabellenspalten und die Monate in die Zeilen setzen:
[4]:
df.pivot_table(columns=["Title", "Language"])
[4]:
Title | Jupyter Tutorial | PyViz Tutorial | Python Basics | ||
---|---|---|---|---|---|
Language | de | en | de | de | en |
2021-12 | 30134.0 | 6073.0 | 4873.0 | 427.0 | 95.0 |
2022-01 | 33295.0 | 7716.0 | 3930.0 | 276.0 | 226.0 |
2022-02 | 19651.0 | 6547.0 | 2573.0 | 525.0 | 157.0 |
Um eine andere Aggregationsfunktion als mean
zu verwenden, übergebt diese an das Schlüsselwortargument aggfunc
. Mit sum
zum Beispiel erhaltet ihr die Summe:
[5]:
df.pivot_table(columns=["Title", "Language"], aggfunc="sum", margins=True)
[5]:
Title | Jupyter Tutorial | PyViz Tutorial | Python Basics | ||||||
---|---|---|---|---|---|---|---|---|---|
Language | de | en | All | de | en | All | de | en | All |
2021-12 | 30134.0 | 6073.0 | 36207.0 | 4873.0 | 0.0 | 4873.0 | 427.0 | 95.0 | 522.0 |
2022-01 | 33295.0 | 7716.0 | 41011.0 | 3930.0 | 0.0 | 3930.0 | 276.0 | 226.0 | 502.0 |
2022-02 | 19651.0 | 6547.0 | 26198.0 | 2573.0 | 0.0 | 2573.0 | 525.0 | 157.0 | 682.0 |
In diesem Fall sind die Werte für All
die Mittelwerte.
Wenn einige Kombinationen leer (oder anderweitig NA
) sind, könnt ihr fill_value
übergeben:
pivot_table
-Optionen:
Funktionsname |
Beschreibung |
---|---|
|
Spaltenname(n) zum Aggregieren; standardmäßig werden alle numerischen Spalten aggregiert |
|
Spaltennamen oder andere Gruppenschlüssel, die in den Zeilen der resultierenden Pivot-Tabelle gruppiert werden sollen |
|
Spaltennamen oder andere Gruppenschlüssel, die in den Spalten der resultierenden Pivot-Tabelle gruppiert werden sollen |
|
Aggregationsfunktion oder Liste von Funktionen (standardmäßig |
|
ersetzt fehlende Werte in der Ergebnistabelle |
|
wenn |
|
fügt Zeilen-/Spalten-Zwischensummen und Gesamtsummen ein (Standardeinstellung: |
|
Name, der für die Zeilen-/Spaltenbeschriftung verwendet wird, wenn |
|
Bei kategorialen Gruppenschlüsseln werden bei |
Kreuztabellen¶
Eine Kreuztabelle ist ein Spezialfall einer Pivot-Tabelle, die die Häufigkeit von Gruppen berechnet. Wollen wir z.B. im Rahmen einer Analyse diese Daten vielleicht ermitteln, welcher Titel in welcher Sprache erschienen ist, so könnten wir dafür pivot_table
verwenden, aber die Funktion pandas.crosstab ist bequemer.
Hierfür setzen wir zunächst die bestehenden Index zurück:
[6]:
df.reset_index(inplace=True)
[7]:
pd.crosstab(df.Title, df.Language)
[7]:
Language | de | en |
---|---|---|
Title | ||
Jupyter Tutorial | 1 | 1 |
PyViz Tutorial | 1 | 1 |
Python Basics | 1 | 1 |
Die ersten beiden Argumente für crosstab
können jeweils entweder ein Array oder eine Series oder eine Liste von Arrays sein.
Mit margins=True
können wir uns auch die Summen der Spalten und Zeilen sowie die Gesamtsumme berechnen lassen:
[8]:
pd.crosstab(df.Title, df.Language, margins=True)
[8]:
Language | de | en | All |
---|---|---|---|
Title | |||
Jupyter Tutorial | 1 | 1 | 2 |
PyViz Tutorial | 1 | 1 | 2 |
Python Basics | 1 | 1 | 2 |
All | 3 | 3 | 6 |