web-dev-qa-db-fra.com

Tracer des histogrammes à partir de données groupées dans un pandas DataFrame

J'ai besoin de quelques conseils pour savoir comment tracer un bloc d'histogrammes à partir de données groupées dans un fichier de données pandas. Voici un exemple pour illustrer ma question:

from pandas import DataFrame
import numpy as np
x = ['A']*300 + ['B']*400 + ['C']*300
y = np.random.randn(1000)
df = DataFrame({'Letter':x, 'N':y})
grouped = df.groupby('Letter')

Dans mon ignorance, j'ai essayé cette commande de code:

df.groupby('Letter').hist()

qui a échoué avec le message d'erreur "TypeError: impossible de concaténer les objets 'str' et 'float'"

Toute aide très appréciée.

43
dreme

Je suis sur une lancée, je viens de trouver un moyen encore plus simple de le faire en utilisant le mot-clé par dans la méthode hist:

df['N'].hist(by=df['Letter'])

C'est un petit raccourci très pratique pour numériser rapidement vos données groupées!

Pour les futurs visiteurs, le produit de cet appel est le tableau suivant: enter image description here

137
dreme

Votre fonction échoue parce que la base de données groupby avec laquelle vous vous retrouvez possède un index hiérarchique et deux colonnes (Lettre et N). Par conséquent, lorsque vous effectuez .hist(), vous essayez de créer un histogramme des deux colonnes, d'où l'erreur str.

Ceci est le comportement par défaut de pandas fonctions de traçage (un tracé par colonne)), donc si vous modifiez la forme de votre bloc de données afin que chaque lettre soit une colonne, vous obtiendrez exactement ce que vous voulez.

df.reset_index().pivot('index','Letter','N').hist()

La reset_index() consiste simplement à déplacer l'index actuel dans une colonne appelée index. Ensuite, pivot prendra votre cadre de données, collectera toutes les valeurs N pour chaque Letter et les transformera en une colonne. Le cadre de données résultant contient 400 lignes (remplit les valeurs manquantes avec NaN) et trois colonnes (A, B, C). hist() produira ensuite un histogramme par colonne et formatera les tracés au besoin.

7
cwharland

Une solution consiste à utiliser l'histogramme matplotlib directement sur chaque trame de données groupée. Vous pouvez parcourir les groupes obtenus en boucle. Chaque groupe est une base de données. Et vous pouvez créer un histogramme pour chacun.

from pandas import DataFrame
import numpy as np
x = ['A']*300 + ['B']*400 + ['C']*300
y = np.random.randn(1000)
df = DataFrame({'Letter':x, 'N':y})
grouped = df.groupby('Letter')

for group in grouped:
  figure()
  matplotlib.pyplot.hist(group[1].N)
  show()
3
Paul

Avec la version récente de Pandas, vous pouvez faire df.N.hist(by=df.Letter)

Comme avec les solutions ci-dessus, les axes seront différents pour chaque sous-parcelle. Je n'ai pas encore résolu celui-là.

0
dirkjot