2016-04-13 19 views
2

ich ein groupby bezwecken wie folgt, nachdem ich lief:GROUPBY Pandas berechnen Prozentsatz

grouped_mask=L2014_2.groupby(['state']) 
grouped_mask.mask.value_counts() 

state mask 
AL  False 105931 
     True   77 
AR  False  67788 
     True  1774 
AZ  False  90068 
     True  151 
CA  False 586184 
     True   4 
CO  False  75188 
     True  14360 
CT  False  78270 
     True   1 

Jetzt muss ich berechnen, was in jedem Zustand Prozentsatz wahr ist. Gibt es eine Möglichkeit, dies zu tun?

+0

tut 'grouped_mask.mask.value_counts(). groupby (level = 0) .apply (Lambda x: x/x.sum())' Arbeit? – EdChum

+0

scheint nicht wirklich richtig, da es mir diesen Zustand Maske AL Falsch 1.00 Wahr 0,00 AR Falsch 0,97 Wahr 0,03 AZ Falsch 1.00 Wahr 0,00 CA Falsch 1.00 Wahr 0,00 CO Falsch 0,84 Wahr 0,16 gibt CT Falsch 1.00 Wahr 0,00 – alice

+0

Das sieht wie ein Display aus, das die signifikanten Ziffern trimmt, wenn Sie mit 100 multiplizieren, sehen Sie mehr Ziffern? – EdChum

Antwort

3

Auch können Sie die normalize Parameter die relativen Häufigkeiten zu erhalten:

grouped_mask.mask.value_counts(normalize=True) 

nur mit 100 multiplizieren die Prozentsätze :-)

Grüße zu bekommen

1

Sie können groupby auf der ersten Ebene und dann eine Lambda-Anwendung, wenn die Wahr/Falsch zählt gegen die Summe teilt:

In [20]: 
df.groupby(level=0).apply(lambda x: x/x.sum() * 100) 

Out[20]: 
       Count 
state mask    
AL False 99.927364 
     True 0.072636 
AR False 97.449757 
     True 2.550243 
AZ False 99.832629 
     True 0.167371 
CA False 99.999318 
     True 0.000682 
CO False 83.963908 
     True 16.036092 
CT False 99.998722 
     True 0.001278 

Um die oben zu filtern, dass nur die False Etiketten erhalten Sie erweiterte Indizierung verwenden können, mit slice s:

In [33]: 
gp = df.groupby(level=0).apply(lambda x: x/x.sum() * 100) 
gp.loc(axis=0)[slice(None),False] 

Out[33]: 
       Count 
state mask    
AL False 99.927364 
AR False 97.449757 
AZ False 99.832629 
CA False 99.999318 
CO False 83.963908 
CT False 99.998722 
+0

Wissen Sie, wie Sie nur die True-Werte danach nehmen? Ich will nicht die falschen Werte – alice

+0

wo 'gp' ist das Ergebnis der oben genannten dann funktioniert das:' 'gp.loc (Achse = 0) [Scheibe (keine), False]' auch Sie können – EdChum

+0

Sie sind super !! – alice

0
gp=grouped_mask.mask.value_counts().groupby(level=0).apply(lambda x: 100*x/float(x.sum())) 

state mask 
AL  False 94.37 
     True  5.63 
AR  False 73.85 
     True  26.15 
AZ  False 91.88 
     True  8.12 
CA  False 99.57 
     True  0.43 
CO  False 64.66 
     True  35.34 
gp.sort_index(level=0) 
gp.loc(axis=0)[slice(None),False] 

KeyError: ‚Multiindex Slicing erfordert den Index komplett lexsorted Tupels len (2) zu sein, l exsort Tiefe (1)‘

+0

Ich sortierte Ebene = 1 auch.es gibt mir immer noch die Multi-Index-Slicing-Fehler – alice

+0

Ich sortierte auch versuchen mit level = "state", immer noch KeyError – alice

+0

Also sollte wirklich eine neue Frage keine Antwort sein, auch müssen Sie das Ergebnis der Sortierung zuordnen, da es nicht vorhanden ist – EdChum