2016-06-26 3 views
0

Ich habe einen Datenrahmen von Studenten Testergebnissen erhalten, wo die beiden Spalten, die ich country und result, wie sind interessieren:Ermitteln der relativen Häufigkeiten für eine kategoriale Variable (gefiltert nach Anzahl)?

country result 
FR   Pass 
FR   Fail 
US   Pass 
US   Pass 
DK   Fail 
DK   Fail 
SE   Pass 
...  ... 

Was ich versuche, herauszufinden, ist, wie man die relative " Fail "Häufigkeit pro Land, absteigend (das heißt - ich will die Studenten aus diesem Land, die versagt haben, als Prozentsatz aller Studenten aus diesem bestimmten Land), aber nur für Länder, die über 200 Absolventen hatten, die den Test bestanden haben:

country % fail students 
FR   0.056  997 
US   0.051  855 
DK   0.042  627 
NL   0.032  511 

Ich habe Kollegen bei der Arbeit gesehen tun es mit einem ver y kurze SQL-Abfrage, aber für das Leben von mir kann ich nicht herausfinden, wie man es mit Pandas macht!

+1

Ihre Eingangsdaten unvollständig sind ... darüber hinaus, was Sie bisher in Python versucht haben? Es ist kein Ort, wo Sie einen kostenlosen Kaffee haben ... –

Antwort

2

Sie können groupby.agg verwenden. Zuerst erstellte ich einen zufälligen Datensatz:

Es hat 1000 Zeilen mit Land und Ergebnis Spalten. Dann habe ich groupby verwendet, um die Prozentsätze zu finden.

gb = df.groupby("country") 
gb['result'].agg(lambda x: len(x[x=="Fail"])/len(x))[gb.size() > 195] 
Out[100]: 
country 
FR 0.472362 
SE 0.520362 
US 0.553299 
Name: result, dtype: float64 

Der erste Teil (gb['result'].agg(lambda x: len(x[x=="Fail"])/len(x))) berechnet die Prozentsätze und [gb.size() > 195] Filter, so dass es nur die, die zeigt, mehr als 195 Studenten haben.

Für die genaue Übereinstimmung Ihrer Probe Ausgabe, können Sie so etwas wie dies versuchen:

gb['result'].agg({"% fail": lambda x: len(x[x=="Fail"])/len(x), "students": len})[gb.size() > 195].sort_values(by="% fail", ascending=False) 
Out[119]: 
      % fail students 
country      
US  0.553299  197 
SE  0.520362  221 
FR  0.472362  199 
Verwandte Themen