Berechnungen mit Pandas
Tabellenkalkulationen und Bibliotheken, die mit Zahlen arbeiten, verfügen über Methoden, um Statistiken über Daten zu erstellen. Betrachten wir an dieser Stelle noch einmal die Gapminder-Daten:
print(df.head(n=10))
| country continent year lifeExp pop gdpPercap
| 0 Afghanistan Asia 1952 28.801 8425333 779.445314
| 1 Afghanistan Asia 1957 30.332 9240934 820.853030
| 2 Afghanistan Asia 1962 31.997 10267083 853.100710
| 3 Afghanistan Asia 1967 34.020 11537966 836.197138
| 4 Afghanistan Asia 1972 36.088 13079460 739.981106
| 5 Afghanistan Asia 1977 38.438 14880372 786.113360
| 6 Afghanistan Asia 1982 39.854 12881816 978.011439
| 7 Afghanistan Asia 1987 40.822 13867957 852.395945
| 8 Afghanistan Asia 1992 41.674 16317921 649.341395
| 9 Afghanistan Asia 1997 41.763 22227415 635.341351
Zu diesem Datensatz könnten wir beispielsweise folgende Fragen stellen:
Wie hoch ist die durchschnittliche Lebenserwartung für jedes Jahr im Datensatz?
Wie gehen wir vor, wenn wir Durchschnittswerte zu Jahren und Kontinenten berechnen möchten?
Wie können wir zählen, wie viele Länder im Datensatz zu den jeweiligen Kontinenten gehören?
Um diese mit Pandas beantworten zu können, braucht es eine "grouped" oder "aggregated" Berechnung. Dabei können wir die Daten entlang bestimmter Linien aufteilen, eine Berechnung auf jedes aufgeteilte Segment anwenden und dann die Ergebnisse in einem neuen DataFrame zusammenführen.
Gruppierte Mittelwerte zählen
Die erste Methode, die wir dafür verwenden, ist Pandas' df.groupby()-Operation. Dazu geben wir eine Spalte an, nach der wir die Daten aufteilen wollen:
df.groupby("year")
Auf diese Weise können wir alle Zeilen mit demselben Jahres-Wert als ein vom DataFrame getrenntes Objekt behandeln. Unter diesen Voraussetzungen können wir die Spalte "Lebenserwartung" (lifeExp) verwenden und ihren Mittelwert für jedes enthaltene Jahr berechnen:
print(df.groupby('year')['lifeExp'].mean())
year
1952 49.057620
1957 51.507401
1962 53.609249
1967 55.678290
1972 57.647386
1977 59.570157
1982 61.533197
1987 63.212613
1992 64.160338
1997 65.014676
2002 65.694923
2007 67.007423
Daraus ergibt sich die durchschnittliche Lebenserwartung für alle Bevölkerungsgruppen, aufgeschlüsselt nach Jahren. Eine ähnliche Berechnung könnten wir für die Bevölkerung (pop) und das BIP pro Jahr (gdpPercap) nutzen:
print(df.groupby('year')['pop'].mean())
print(df.groupby('year')['gdpPercap'].mean())
Wenn wir unsere Daten allerdings nach mehr als einer Spalte gruppieren wollen, übergeben wir Spalten in Listen:
print(df.groupby(['year', 'continent'])
[['lifeExp', 'gdpPercap']].mean())
lifeExp gdpPercap
year continent
1952 Africa 39.135500 1252.572466
Americas 53.279840 4079.062552
Asia 46.314394 5195.484004
Europe 64.408500 5661.057435
Oceania 69.255000 10298.085650
1957 Africa 41.266346 1385.236062
Americas 55.960280 4616.043733
Asia 49.318544 5787.732940
Europe 66.703067 6963.012816
Oceania 70.295000 11598.522455
1962 Africa 43.319442 1598.078825
Americas 58.398760 4901.541870
Asia 51.563223 5729.369625
Europe 68.539233 8365.486814
Oceania 71.085000 12696.452430
Diese .groupby()
-Operation gruppiert unsere Daten zunächst nach Jahr und anschließend nach Kontinent. Dann werden Mittelwerte aus den Spalten Lebenserwartung und BIP gebildet. Auf diese Weise können Sie Ihre Daten gruppieren und festlegen, wie sie dargestellt und in welcher Reihenfolge sie berechnet werden sollen.
Wenn Sie die Ergebnisse in einem einzigen, inkrementell indizierten Rahmen "glätten" möchten, können Sie die .reset_index()
-Methode auf die Ergebnisse anwenden:
gb = df.groupby(['year', 'continent'])
[['lifeExp', 'gdpPercap']].mean()
flat = gb.reset_index()
print(flat.head())
| year continent lifeExp gdpPercap
| 0 1952 Africa 39.135500 1252.572466
| 1 1952 Americas 53.279840 4079.062552
| 2 1952 Asia 46.314394 5195.484004
| 3 1952 Europe 64.408500 5661.057435
| 4 1952 Oceana 69.255000 10298.085650
Gruppierte Häufigkeiten zählen
Ein weiterer häufiger Use Case für Daten sind Häufigkeitsberechnungen. Um eindeutige Werte in einer Reihe - und ihre Häufigkeit zu ermitteln - lassen sich die Methoden nunique
und value_counts
verwenden. So lässt sich zum Beispiel herausfinden, wie viele Länder zu den jeweiligen Kontinenten (siehe Eingangsfragen) gehören:
print(df.groupby('continent')['country'].nunique())
continent
Africa 52
Americas 25
Asia 33
Europe 30
Oceana 2