1
votes

Python: synthèse et agrégation de groupes et sous-groupes dans DataFrame

J'essaye de construire un tableau qui a des groupes qui sont divisés en sous-groupes avec le nombre et la moyenne pour chaque sous-groupe. Par exemple, je souhaite convertir le bloc de données suivant:

Vers une table qui ressemble à ceci où l ' intervalle est un groupe plus grand et les colonnes a à i deviennent des sous-groupes au sein du groupe avec le nombre et la moyenne des sous-groupes correspondants en chaque cellule:

J'ai essayé ceci sans succès:


0 commentaires

3 Réponses :


2
votes

Essayez.

df.groupby(['interval']).apply(lambda x : x.stack()
                                           .groupby(level=-1)
                                           .agg({'count', 'mean'}))

Utilisez groupby avec apply pour appliquer une fonction pour chaque groupe puis stack et groupby à nouveau avec agg pour trouver count et mean.


3 commentaires

Je reçois un message d'erreur disant TypeError: count () prend 1 argument de position mais 2 ont été donnés


@ user9532692 Cela a bien fonctionné pour moi. Je ne suis pas sûr de ce qui s'est passé. Pouvez-vous essayer d'utiliser uniquement moyen ou de remplacer count par size ?


Je reçois toujours un message d'erreur indiquant DataError: aucun type numérique à agréger . Je me suis demandé si c'était parce que les valeurs des données ne sont pas en nombre entier, mais l'exécution de type (hh.iloc [1,1]) renvoie numpy.int64



1
votes

Utilisez DataFrame.melt avec GroupBy.agg et des tuples pour les fonctions d'agrégation avec de nouveaux noms de colonnes:

df1 = (df.melt('interval', var_name='source')
         .groupby(['interval','source'])['value']
         .agg([('cnt','count'), ('average','mean')])
         .reset_index())
print (df1.head())
  interval source  cnt  average
0        0      a    1      5.0
1        0      b    1      0.0
2        0      c    1      0.0
3        0      d    1      0.0
4        0      f    1      0.0


3 commentaires

Le résultat semble compter les éléments qui tombent dans chaque intervalle uniquement. Comment pouvez-vous faire pour compter les éléments qui appartiennent à la fois à intervalle et source ?


@ user9532692 - Je suis confus avec la sortie, pouvez-vous expliquer la ligne 6 ~ 9 a 2 7 de la sortie? pourquoi 2 ? pourquoi 7 ?


2 est le décompte de tous les éléments compris dans l'intervalle 6 ~ 9 AND source a. 7 est la moyenne de ces deux éléments qui appartiennent au même groupe (intervalle 6 ~ 9 ET où la source est a)



0
votes

Le code suivant résout le problème que j'ai demandé:

df.group(['interval'],,as_index=False).agg({
                                                'a':{"count":"mean"},
                                                'b':{"count":"mean"},
                                                'c':{"count":"mean"},
                                                'd':{"count":"mean"},
                                                'f':{"count":"mean"},
                                                'g':{"count":"mean"},
                                                'i':{"count":"mean"}
                                            })


0 commentaires