Pandas Python: regrouper par groupe par et moyenne?

89

J'ai un dataframe comme celui-ci:

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

Je voudrais calculer le temps moyen par organisation par cluster.

Résultat attendu:

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

Je ne sais pas comment le faire dans Pandas, quelqu'un peut-il m'aider?

UserYmY
la source
2
Pardon, tu veux df.groupby(['org','cluster']).mean()? ce n'est pas si significatif pour votre jeu de données que ceci:df.groupby(['cluster','org']).mean()
EdChum
@EdChum merci pour votre aide, mais je ne veux aucun d'entre eux. Mais la "moyenne des temps moyens par organisation". S'il vous plaît voir le résultat attendu (modifié)
UserYmY

Réponses:

125

Si vous voulez d'abord prendre la moyenne de la combinaison de ['cluster', 'org'], puis prendre la moyenne des clustergroupes, vous pouvez utiliser:

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

Si vous voulez clusteruniquement la moyenne des groupes, vous pouvez utiliser:

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

Vous pouvez également utiliser groupbyle ['cluster', 'org']puis utilisez 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
Zéro
la source
Mais je veux un nombre par cluster (moyenne du temps moyen par organisation). Donc, le résultat n'est que le cluster et le temps moyen
UserYmY
1
Le premier est ce dont j'avais besoin merci - y a-t-il un moyen simple d'ajouter une colonne dans le df contenant ces valeurs moyennes pour le cluster de lignes?
Mr_and_Mrs_D
12

Je ferais simplement ceci, ce qui suit littéralement la logique souhaitée:

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