Python: Daten gruppieren und aggregieren mit Pandas (Grundlagen)

Durchschnitte bilden kann jeder. Aber wie erstellst du aussagekräftige deskriptive Statistiken, die sich auf bestimmte Gruppen in deiner Stichprobe beziehen? 

Warum willst du Daten aggregieren?

Gut, dass du fragst. Sagen wir, du willst den deutschen Immobilienmarkt analysieren und schaust dir dazu Daten von neu vermieteten Wohnungen an.

Die Tabelle oben zeigt beispielhaft einen Pandas DataFrame namens “wohnungen” mit 20 Wohnungen samt einiger Eckdaten. Eine Möglichkeit ist, deskriptive Statistiken über den gesamten DataFrame zu erhalten.

wohnungen.describe()

Die Funktion oben ist hilfreich, um einen ersten Überblick über eine gesamte Stichprobe zu bekommen. Sie gibt für jede “geeignete” Spalte die Anzahl der Einträge, den Durchschnitt, die Standardabweichung, Minimum und Maximum und drei Perzentile zurück. Nicht geeignet sind zum Beispiel Spalten mit Text. Hier wurden die Spalten “bundesland” und “stadt” ignoriert.

Doch mit diesen grobkörnigen Aussagen wollen wir uns nicht zufrieden geben. Wir wollen nicht nur wissen, wie hoch die durchschnittliche Kaltmiete ist, sondern wie der Durchschnitt in jedem der Bundesländer ist.

Und wie mache ich das jetzt?

Wir brauchen die groupby()-Funktion von Pandas. Wie der Name schon verrät, kann man mit ihrer Hilfe tabellarische Daten nach einer oder mehreren Dimensionen gruppieren. Hier nach Bundesland.

gruppiert = wohnungen.groupby("bundesland").mean()

Die Funktion wird auf einen DataFrame angewendet und enthält als Argument die Spalte, deren Inhalt man gruppieren will. Damit letztendlich auch ein Ergebnis ausgespuckt wird, muss man definieren, nach welcher Methode die numerischen Werte der Tabelle aggregiert werden – hier mean(). Das Resultat sieht folgendermaßen aus:

Das Ergebnis ist ein nach Bundesländern gruppierter DataFrame. Der neue Index besteht aus den eindeutigen Einträgen der gruppierten Spalte, der Inhalt des DataFrames sind die Gruppendurchschnitte der numerischen Spalten. Jetzt kannst du den DataFrame ganz einfach mit dem entsprechenden Bundesland ansprechen.

print(gruppiert.loc["Bayern"])

Die durchschnittliche bayrische Wohnung in unserer Stichprobe kostet also 761€ kalt. Neben der Funktion mean() sind auch median(), min(), max()undcount()sehr nützlich.

Gruppen von Gruppen

Wie oben schon angedeutet kannst du mehrere Spalten in die Gruppierung einbeziehen. Das tust du, indem du groupby() als Argument statt nur einer Spalte eine Liste von Spalten zuweist – zum Beispiel “zimmer” und “hat_kueche”.

gruppiert = wohnungen.groupby(["zimmer","hat_kueche"]).mean()
gruppiert

Das Ergebnis ist ein neuer DataFrame mit einem mehrspaltigen Index. Wir sehen, dass es in unserer Stichprobe keine Wohnungen mit 3 oder 4 Zimmern gibt, in denen schon eine Küche existiert. Auch diesen DataFrame können wir mit seinem Index ansprechen.

Wohnungen mit einem Zimmer:

gruppiert.loc[1]

Wohnungen mit einem Zimmer und keiner Küche:

gruppiert.loc[1,0]

Wohnungen mit 2 bis 4 Zimmern:

gruppiert.loc[2:4]

Wie du siehst, kannst du beide Indexspalten nutzen, um den DataFrame anzusprechen.

Kann ich auch ALLES gruppieren?

Versuchen wir es doch einfach mal und schauen, was dabei herauskommt…

gruppiert = wohnungen.groupby(["bundesland","stadt","baujahr",
                               "etage","hat_kueche","kaltmiete",
                               "wohnflaeche","zimmer"]).mean()

…uuuuuuuuuuuuuuuund…

… geht nicht. Denn Pandas will zumindest eine Spalte haben, die es aggregieren kann. Hier wäre jedoch die komplette Tabelle ein einziger mehrspaltiger Index. Allerdings ist es möglich, alles bis auf eine Spalte zu gruppieren.

gruppiert = wohnungen.groupby(["bundesland","stadt","baujahr",
                               "etage","hat_kueche",
                               "wohnflaeche","zimmer"]).mean()
gruppiert

Hier haben wir alle Spalten bis auf die Kaltmiete gruppiert. Wenn auch nicht sinnvoll, ist es durchaus möglich, Daten in dieser Weise zu gruppieren. Auch diese Tabelle können wir wieder mit ihrem kompletten Index ansprechen.

gruppiert.loc["Bayern","Aschaffenburg_Kreis",1965,2,0,85,3]

Das waren die Grundlagen

Jetzt kannst du Daten in Python gruppieren, aggregieren und damit ganz einfach aussagekräftige Statistiken erstellen. Mit dem Wissen kommst du schon weit.  Aber wie wendest du jede beliebige Funktion als Aggregationsmethode an?  Wie nutzt du unterschiedliche Funktionen für unterschiedliche Spalten? Wie aggregierst du dieselbe Spalte mit unterschiedlichen Funktionen? Das alles erfährst du im nächsten Beitrag.

Wenn du jetzt schon so wissenshungrig bist und tiefer in die Materie eindringen willst, dann hol dir dieses Buch:

Anzeige

Dort erfährst du nicht nur alles über das Aggregieren von Daten, sondern bekommst tiefe Einblicke in die gesamte Welt der Analyse von großen Datensätzen mit Python und den dazugehörigen Packages.

Viel Spaß beim Analysieren! 🙂

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.