2016-06-26 31 views
0

我已經得到了學生的考試結果的數據幀,而該權益的兩列我是countryresult,如:獲取分類變量的相對頻率(按計數過濾)?

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

我試圖找出是如何得到的相對「每個國家的失敗頻率下降(意思是 - 我希望那個國家的學生失敗,佔所有國家學生的比例),但是隻有那些已經結束的國家,比方說,有200名學生參加測試:

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

我見過在工作的同事用ver y簡短的SQL查詢,但對於我的生活,我無法弄清楚如何用熊貓來做到這一點!

+1

輸入數據是不完整的......而且你嘗試過在Python這麼遠?這不是一個你有免費咖啡的地方... –

回答

2

您可以使用groupby.agg。首先我創建了一個隨機數據集:

import numpy as np 
np.random.seed(0) 
countries = ["FR", "US", "DK", "SE", "NL"] 
df = pd.DataFrame({"country": np.random.choice(countries, 1000), "result": np.random.choice(["Pass", "Fail"], 1000)}) 

它有1000行,包含國家和結果列。然後我使用groupby來查找百分比。

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 

第一部分(gb['result'].agg(lambda x: len(x[x=="Fail"])/len(x)))計算百分比和[gb.size() > 195]過濾器,以便它只能說明有超過195所大學。

爲您的樣品輸出的精確匹配,你可以嘗試這樣的事:

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