Pandas – Trasarea unui grafic cu bare suprapuse (Programare, Python, Matplotlib, Pandas, Ipython Notebook, Python 3.4)

Kuzen a intrebat.
a intrebat.

Încerc să creez un grafic de bare stivuite care să reproducă imaginea, toate datele mele sunt separate de acea foaie de calcul Excel.

Nu pot să-mi dau seama cum să fac un cadru de date pentru el ca în imagine și nici nu pot să-mi dau seama cum să fac graficul de bare stivuite. Toate exemplele pe care le localizez funcționează în moduri diferite față de ceea ce încerc să creez eu.

Dataframe-ul meu este un csv cu toate valorile restrânse la următoarele cu un dataframe pandas.

      Site Name    Abuse/NFF
0    NORTH ACTON       ABUSE
1    WASHINGTON         -
2    WASHINGTON        NFF
3    BELFAST            -
4    CROYDON            - 

Am reușit să număr datele cu totaluri și să obțin numărători individuale pentru fiecare site, doar că nu reușesc să le combin într-un mod care să permită realizarea unui grafic.

Aș aprecia foarte mult niște îndrumări puternice.

Cod finalizat, multe mulțumiri pentru asistență completarea.

test5 = faultdf.groupby(['Site Name', 'Abuse/NFF'])['Site Name'].count().unstack('Abuse/NFF').fillna(0)

test5.plot(kind='bar', stacked=True)

Comentarii

  • Notă pentru cititori: Dacă primiți mesajul KeyError legat de index atunci când încercați răspunsul acceptat, utilizați codul completat aici în întrebare. –  > Por KobeJohn.
4 răspunsuri
chucklukowski

Primiți erori sau pur și simplu nu sunteți sigur de unde să începeți?

%pylab inline
import pandas as pd
import matplotlib.pyplot as plt

df2 = df.groupby(['Name', 'Abuse/NFF'])['Name'].count().unstack('Abuse/NFF').fillna(0)
df2[['abuse','nff']].plot(kind='bar', stacked=True)

Comentarii

  • Asta produce acest lucru i.imgur.com/hocPgWg.jpg ceea ce nu este chiar corect, am nevoie ca partea stivuită să fie numărul coloanei de abuz / nff pentru fiecare site. Nu primesc erori, doar că mă chinui să încep. Mulțumesc pentru răspuns. –  > Por Kuzen.
  • Am actualizat răspunsul meu pentru a include partea [‘Abuse/NFF’] după funcția groupby. Adăugarea acestui lucru înseamnă că coloana Abuzuri va fi singura valoare care este agregată (numărată în acest exemplu). –  > Por chucklukowski.
  • Nu funcționează din păcate, este practic același grafic acum, dar fără a fi stivuit, fără erori, fără legendă, fără verde practic. Numără mai degrabă totalurile decât totalurile valorilor din coloanele per magazin, dacă are sens. –  > Por Kuzen.
  • O altă încercare. Dacă doriți să vedeți golurile, schimbați începutul ultimei linii în… df2.plot( –  > Por chucklukowski.
  • Noroc pentru încă o încercare, dar tot nu am avut nicio bucurie. Va pune codul pe întrebarea mea de mai sus , obținând o eroare. KeyError: „[‘ABUSE’ ‘NFF’ ‘NFF’ ‘-‘] not in index” Am făcut ajustări la cod astfel încât să se potrivească cu dataframe-ul meu, dar se pare că nu reușesc să-l fac să funcționeze, de asemenea, vreau – în rezultate, trebuie să schimb – pentru a însemna defectuos, dar nu am reușit să fac asta. –  > Por Kuzen.
Domino

Asta ar trebui să vă ajute

df.groupby(['NFF', 'ABUSE']).size().unstack().plot(kind='bar', stacked=True)

Rafael Jose Gonzlez de Gouveia

Poate că puteți folosi funcția crosstab din pandas

test5 = pd.crosstab(index=faultdf['Site Name'], columns=faultdf[''Abuse/NFF''])

test5.plot(kind='bar', stacked=True)

kamran kausar

Dacă doriți să modificați dimensiunea graficului utilizarea arg figsize

df.groupby(['NFF', 'ABUSE']).size().unstack()
      .plot(kind='bar', stacked=True, figsize=(15, 5))