2014-11-26 10 views
6

ho la seguente struttura dati (df) in panda:pandi indice frame di dati trama istogramma

 NetPrice Units Royalty 
Price      
3.65 9.13 171 57.60 
3.69 9.23  13  4.54 
3.70 9.25 129 43.95 
3.80 9.49 122 42.76 
3.90 9.74 105 38.30 
3.94 9.86 158 57.35 
3.98 9.95  37 13.45 
4.17 10.42  69 27.32 
4.82 12.04 176 77.93 
4.84 24.22 132 59.02 
5.16 12.91 128 60.81 
5.22 13.05 129 62.00 

Sto provando a generare un istogramma sull'indice ("Prezzo) con un asse y" Unità ". ho iniziato con il seguente:.?

plt.hist(df.index) 

Questo mi dà un istogramma tramando il prezzo Come posso aggiungere le Unità per l'asse y In questo momento è solo una 'scala'

Grazie!

+0

un istogramma spettacoli la distribuzione dei valori in un singolo set di dati (ad esempio, quanti sono compresi tra 3.6 e 3.8). Se vuoi tracciare due cose l'una contro l'altra, probabilmente vuoi solo un grafico a barre. Prova 'plt.bar (df.index, df.Units)' – snorthway

+0

Alcuni dei miei dati sono piuttosto grandi, quindi un grafico a barre non funzionerà. Voglio che "quanti rientrano tra 3.6 e 3.8" sia il numero di unità in modo da poter sempre vedere quante unità sono state vendute in ciascun contenitore. – DigitalMusicology

risposta

13

Poiché i dati sono già parzialmente aggregati, non è possibile utilizzare direttamente i metodi hist(). Come @snorthway ha detto nei commenti, puoi farlo con un grafico a barre. Solo tu devi prima mettere i tuoi dati in bucket. Il mio modo preferito per mettere i dati in bucket è con il metodo panda cut().

Facciamo impostare alcuni dati di esempio in quanto non ha fornito un po 'di che è facile da usare:

np.random.seed(1) 
n = 1000 
df = pd.DataFrame({'Price' : np.random.normal(5,2,size=n), 
        'Units' : np.random.randint(100, size=n)}) 

Mettiamo i prezzi in 10 secchi equidistanti:

df['bucket'] = pd.cut(df.Price, 10) 
print df.head() 

     Price Units   bucket 
0 8.248691  98 (7.307, 8.71] 
1 3.776487  8 (3.0999, 4.502] 
2 3.943656  89 (3.0999, 4.502] 
3 2.854063  27 (1.697, 3.0999] 
4 6.730815  29 (5.905, 7.307] 

Così ora abbiamo un campo che contiene il range del secchio. Se vuoi dare a quei secchi altri nomi, puoi leggere a riguardo nell'eccellente Pandas documentation. Ora siamo in grado di utilizzare il metodo Panda groupby() e sum() a sommare quote:

newdf = df[['bucket','Units']].groupby('bucket').sum() 
print newdf 
        Units 
bucket     
(-1.122, 0.295]  492 
(0.295, 1.697]  1663 
(1.697, 3.0999] 5003 
(3.0999, 4.502] 11084 
(4.502, 5.905] 15144 
(5.905, 7.307] 11053 
(7.307, 8.71]  4424 
(8.71, 10.112]  1008 
(10.112, 11.515]  77 
(11.515, 12.917] 122 

Che assomiglia a un vincitore ... ora cerchiamo di tracciarla:

newdf.plot(kind='bar') 

enter image description here

Problemi correlati