101 votes

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

Comment tracer un bloc d'histogrammes à partir d'un groupe de données dans un dataframe? Par exemple, étant donné:

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

J'ai essayé:

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

...ce qui a échoué avec le message d'erreur:

TypeError: ne peut pas concaténer des objets 'str' et 'float'

263voto

dreme Points 1657

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

df.hist('N', by='Letter')

C'est un petit raccourci très pratique pour scanner rapidement vos données regroupées !

Pour les futurs visiteurs, le résultat de cet appel est le graphique suivant :

résultat de la commande plot hist

En réponse aux questions ci-dessous, voici un exemple d'adaptation spécifique des graphiques histogramme :

# import des bibliothèques
import pandas as pd
import numpy as np

# Créer un dataframe de test
x = ['A']*300 + ['B']*400 + ['C']*300
y = np.random.randn(1000)
z = np.random.randn(1000)
df = pd.DataFrame({'Letter':x, 'N1':y, 'N2':z})

# Tracer les histogrammes
axes = df.hist(['N1','N2'], by='Letter',bins=10, layout=(2,2),
               legend=True, yrot=90,sharex=True,sharey=True, 
               log=True, figsize=(6,6))
for ax in axes.flatten():
    ax.set_xlabel('N')
    ax.set_ylabel('Compte')
    ax.set_ylim(bottom=1,top=100)

entrez la description de l'image ici

14voto

Paul Points 1382

Une solution est d'utiliser l'histogramme matplotlib directement sur chaque dataframe groupé. Vous pouvez boucler à travers les groupes obtenus dans une boucle. Chaque groupe est un dataframe. 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({'Lettre':x, 'N':y})
grouped = df.groupby('Lettre')

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

10voto

dirkjot Points 651

Avec la dernière version de Pandas, vous pouvez faire df.N.hist(by=df.Letter)

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

9voto

cwharland Points 5385

Votre fonction échoue parce que le dataframe groupby avec lequel vous vous retrouvez a un index hiérarchique et deux colonnes (Letter et N) donc lorsque vous utilisez .hist(), il essaie de faire un histogramme des deux colonnes d'où l'erreur str.

C'est le comportement par défaut des fonctions de tracé de pandas (un tracé par colonne) donc si vous remodelez votre dataframe de sorte que chaque lettre soit une colonne, vous obtiendrez exactement ce que vous voulez.

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

Le reset_index() sert simplement à insérer l'index actuel dans une colonne appelée index. Ensuite, pivot prendra votre dataframe, collectera toutes les valeurs de N pour chaque Letter et les placera dans une colonne. Le dataframe résultant a 400 lignes (remplit les valeurs manquantes avec NaN) et trois colonnes (A, B, C). hist() produira alors un histogramme par colonne et vous pourrez formater les graphiques comme nécessaire.

2voto

In code veritas Points 595

Je trouve cela encore plus facile et plus rapide.

data_df.groupby('Letter').count()['N'].hist(bins=100)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X