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"}
})