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:
3 Réponses :
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
.
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
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
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)
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"} })