Pandas-Tutorial

So geht Datenanalyse mit Python

16.04.2024
Von 
Serdar Yegulalp schreibt für unsere US-Schwesterpublikation Infoworld.

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