Python Pandas: Gruppieren nach Gruppieren nach und Durchschnitt?

89

Ich habe einen Datenrahmen wie diesen:

cluster  org      time
   1      a       8
   1      a       6
   2      h       34
   1      c       23
   2      d       74
   3      w       6 

Ich möchte den Durchschnitt der Zeit pro Organisation und Cluster berechnen.

Erwartetes Ergebnis:

cluster mean(time)
1       15 ((8+6)/2+23)/2
2       54   (74+34)/2
3       6

Ich weiß nicht, wie es in Pandas geht, kann jemand helfen?

UserYmY
quelle
1
Entschuldigung, willst du df.groupby(['org','cluster']).mean()? Dies ist nicht so aussagekräftig für Ihren Datensatz im Gegensatz dazu:df.groupby(['cluster','org']).mean()
EdChum
@ EdChum danke für deine Hilfe, aber ich will ist keiner von ihnen. Aber der "Durchschnitt der durchschnittlichen Zeiten pro Organisation". Bitte sehen Sie das erwartete Ergebnis (bearbeitet)
UserYmY

Antworten:

125

Wenn Sie zuerst den Mittelwert für die Kombination von ['cluster', 'org']und dann den Mittelwert für clusterGruppen ermitteln möchten , können Sie Folgendes verwenden:

In [59]: (df.groupby(['cluster', 'org'], as_index=False).mean()
            .groupby('cluster')['time'].mean())
Out[59]:
cluster
1          15
2          54
3           6
Name: time, dtype: int64

Wenn Sie nur den Mittelwert von clusterGruppen möchten , können Sie Folgendes verwenden:

In [58]: df.groupby(['cluster']).mean()
Out[58]:
              time
cluster
1        12.333333
2        54.000000
3         6.000000

Sie können auch verwenden , groupbyauf ['cluster', 'org']und verwenden Sie dann mean():

In [57]: df.groupby(['cluster', 'org']).mean()
Out[57]:
               time
cluster org
1       a    438886
        c        23
2       d      9874
        h        34
3       w         6
Null
quelle
Aber ich möchte eine Zahl pro Cluster (Durchschnitt der durchschnittlichen Zeit pro Organisation). Das Ergebnis ist also nur Cluster und durchschnittliche Zeit
UserYmY
1
Das erste ist das, was ich brauchte, danke - gibt es eine einfache Möglichkeit, eine Spalte im df hinzuzufügen, die diese Mittelwerte für den Zeilencluster enthält?
Mr_and_Mrs_D
12

Ich würde dies einfach tun, was buchstäblich Ihrer gewünschten Logik folgt:

df.groupby(['org']).mean().groupby(['cluster']).mean()
Vince Payandeh
quelle