Über gruppiertes Dataframe mit aggregierten Werten iterieren und ausgeben

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
jodu
User
Beiträge: 5
Registriert: Mittwoch 4. September 2019, 13:42

Hallo,

ich habe ein pandas.DataFrame gruppiert nach mehreren Spalten und möchte die (restlichen) beiden numerischen Spalten ("Wert1", "Wert2") jeweils pro Gruppe aufsummieren.
Anschließende möchte ich die Gruppen durchlaufen und diese sowie die dazugehörigen aggregierten Summen ausgeben.
Mein folgender Ansatz war leider bzgl. der Iteration erfolglos:

Code: Alles auswählen

df_grouped = df.groupby(["Spalte1", "Spalte2", "Spalte3", "Spalte4"]).sum()
for grp, agg_results in df_grouped:
	print(grp[0], grp[1], grp[2], grp[3], str(agg_results[0]), str(agg_results[1]))
Der Print-Befehl steht nur stellvertretend. Tatsächlich sollen die Gruppen-Elemente dann Variablen zugewiesen werden.

Für Hilfe wäre ich sehr dankbar!

MfG
Jodu
jodu
User
Beiträge: 5
Registriert: Mittwoch 4. September 2019, 13:42

Habe inzwischen nach längerem Suchen eine Lösung gefunden:

Code: Alles auswählen

df_grouped = df.groupby(["Spalte1", "Spalte2", "Spalte3", "Spalte4"]).sum()
for grp in df_grouped.index:
	spalte1 = grp[0]
	spalte2 = grp[1]
	spalte3 = grp[2]
	spalte4 = grp[3]	
	wert1 = df_grouped.loc[grp][0]
        wert2 = df_grouped.loc[grp][1]
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Du suchst einfach `iterrows`:

Code: Alles auswählen

for grp, agg_results in df_grouped.iterrows():
    print(grp[0], grp[1], grp[2], grp[3], agg_results.iloc[0], agg_results.iloc[1])
Eingerückt wird übrigens mit 4 Leerzeichen, keine Tabs.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Und wenn man das Varialen zuweist kann man das einfacher schreiben als selbst in jeder Zeile einen laufenden Index hinzuschreiben:

Code: Alles auswählen

   for grp, agg_results in df_grouped.iterrows():
        spalte_a, spalte_b, spalte_c, spalte_d = grp
        wert_a, wert_b = agg_results
        # Do something…
Oder:

Code: Alles auswählen

    for (
        (spalte_a, spalte_b, spalte_c, spalte_d),
        (wert_a, wert_b),
    ) in df_grouped.iterrows():
        # Do something…
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
jodu
User
Beiträge: 5
Registriert: Mittwoch 4. September 2019, 13:42

Danke vielmals für die Verbesserungsvorschläge!
Antworten