2016-04-01 17 views
1

Ich habe, was ich denke, sollte eine ziemlich einfache Frage, aber ich habe stundenlangPandas - Aggregieren und Plotten Ergebnisse

ich mit ihm gekämpft will eine Aggregation auf einem Pandas Datenrahmen zu tun und es dann matplotlib mit plotten

Ich beginne mit einer riesigen Tabelle von Jahren und Modellen von Autos. Ich möchte dann den Gesamtverkaufspreis und einen Prozentsatz der Angebotspreise berechnen.

ich das wie folgt

percent_asking_price =(df.groupby(['year','model'])['salesprice'].sum()/df.groupby(['year','model'])['askingprice'].sum())*100 

, das zu tun scheint, was ich will es tun, aber dann weiß ich nicht, was mit dem Ausgang zu tun - es gibt Ausgabe, die wie folgt aussieht:

Sample Output Data

von diesem Punkt an, ich nicht herausfinden kann, was damit zu tun .. ich möchte die Kombination des Jahres und den Modellnamen grafisch darzustellen matplotlib mit, um es so etwas wie dies aussehen:

Sample Chart

Ein bisschen frustriert, weil das etwas ist, ich ddply und ggplot in r wirklich schnell tun können, verwenden, sondern kann einfach nicht überall hier

Ich habe versucht, die Ausgabe in eine Datenrahmen konvertieren, aber das didnt mich überall bekommen wirklich

Würde

Ein kleiner Satz helfen schätzen, dass die Ergebnisse folgt zeigen:

year,model,salesprice,askingprice 
2009,Taurus,25410,30000 
2009,Taurus,8698,10000 
2009,Maxima,11135,15000 
2009,Maxima,8500,10000 
2010,Corvette,25000,30000 
2010,Corvette,18320,20000 
2010,Trans Am,32000,35000 
2010,Trans Am,23620,25000 

Endlich gibt es eine Möglichkeit, die Ausgabe in einen Datenrahmen zu konvertieren, der wie folgt aussieht, damit ich weitere Arbeit an der Ausgabe machen kann? Ich will nicht die Werte in der ersten Spalte ..

enter image description here

Dank verlieren!

+0

Sie bitte Ihre Originaldaten zeigen, bevor die Gruppierung so können wir Ihre ganze Frage reproduzieren. –

+0

Jahre, Modell, Verkaufspreis, angefragte Kaufpreis 2009, Stier, 25410,30000 2009, Stier, 8698,10000 2009 Maxima, 11135,15000 2009 Maxima, 8500,10000 2010 Corvette, 25000,30000 2010 , Corvette, 18320,20000 2010, Trans Am, 32000,35000 2010, Trans Am, 23620,25000 –

Antwort

1

Try this:

In [383]: df_plt = ((df.groupby(['year','model'])['salesprice'].sum() \ 
    .....:   /\ 
    .....:   df.groupby(['year','model'])['askingprice'].sum())*100).reset_index() 

In [384]: df_plt 
Out[384]: 
    year  model  0 
0 2009 Maxima 78.54 
1 2009 Taurus 85.27 
2 2010 Corvette 86.64 
3 2010 Trans Am 92.70 

In [385]: df_plt['Year_Model'] = df_plt.year.astype(str) + ' ' + df_plt.model 

In [386]: df_plt 
Out[386]: 
    year  model  0  Year_Model 
0 2009 Maxima 78.54 2009 Maxima 
1 2009 Taurus 85.27 2009 Taurus 
2 2010 Corvette 86.64 2010 Corvette 
3 2010 Trans Am 92.70 2010 Trans Am 


In [387]: df_plt = df_plt.set_index('Year_Model')[[0]].rename(columns={0:'Percent Asking Price'}) 

In [388]: df_plt 
Out[388]: 
       Percent Asking Price 
Year_Model 
2009 Maxima     78.54 
2009 Taurus     85.27 
2010 Corvette     86.64 
2010 Trans Am     92.70 

In [389]: matplotlib.style.use('ggplot') 

In [390]: ax = df_plt.plot(kind='bar', rot=0) 

In [391]: ax.yaxis.grid(True) 

enter image description here

+0

Das funktioniert, aber wie hast du den Pct in der Legende angezeigt? Gibt es auch eine Möglichkeit, die Werte nur als verketteten Text (d. H. 2009 Taurus) und nicht als (2009, Taurus) anzuzeigen? Danke –

+0

@Jeff, überprüfen Sie meine aktualisierte Antwort – MaxU

+0

Sie sind erstaunlich .. Danke! So enttäuscht R ist so viel einfacher .. das ist verrückt –

Verwandte Themen