2016-05-24 135 views
1

說的百分比,我有這樣的數據:熊貓 - 數組大小

col1 col2 other columns.. 
0  0 ... 
0  0 ... 
0  0 ... 
0  0 ... 
0  0 ... 
0  0 ... 
0  0 ... 
0  0 ... 
0  0 ... 
0  0 ... 
0  1 ... 
0  1 ... 
0  1 ... 
0  1 ... 
0  1 ... 
0  1 ... 
1  0 ... 
1  0 ... 
etc... 

數據已經由2列(它已經由分類結果)進行分組:

gr = df.groupby(['col1', 'col2']).size() 

col1 col2   
0  0   10 
     1   5 
1  0   2 
     1   16 
2  0   10 

所以現在我需要弄清楚每個小組中有多少個百分比,每個小組的計數有兩列:

我需要再添加一列,或者轉換爲系列(更好)以獲得col2的百分比。 y中的基團(COL1),如:

 col1  col2 
0  0   0.66 
     1   0.33 
1  0   0.1 
     1   0.9 
2  0   1 

或者也可以爲每個組獨立的系列:[0.66 0.1 1][0.33 0.9]。 如何實現它?

那麼讓我來描述這個數據的含義。例如,它可以是科目(0,1,2),結果(0或1)以及每個科目每個科目的學生數量。 因此,整個想法是弄清楚爲什麼百分比的學生不合格/通過科目0,1等

另外一件事 - 有時只有一個結果(0或1)像所有學生的主題過去了,我仍然需要能夠告訴爲0這個問題比例0,0和1是1

回答

2

您需要groupby通過指數的第一級與sum

gr = df.groupby(['col1', 'col2']).size() 
print (gr) 
col1 col2 
0  0  10 
     1  5 
1  0  2 
     1  16 
2  0  10 
dtype: int64 

print (gr.groupby(level=0).sum()) 
col1 
0 15 
1 18 
2 10 
dtype: int64 

print (gr/gr.groupby(level=0).sum()) 
col1 col2 
0  0  0.666667 
     1  0.333333 
1  0  0.111111 
     1  0.888889 
2  0  1.000000 
dtype: float64 

對於存儲Series使用字典理解:

dfs = {i:g.reset_index(drop=True) for i, g in g1.groupby(level=1)} 

print (dfs[0]) 
0 0.666667 
1 0.111111 
2 1.000000 
dtype: float64 

print (dfs[1]) 
0 0.333333 
1 0.888889 
dtype: float64 
+0

非常感謝您的回覆。但我相信我描述了錯誤的任務,讓我添加更多細節並糾正錯誤。我很抱歉。請查看更新後的問題。 – mimic

+0

解決方案已更改,請檢查它。 – jezrael

+0

非常感謝jezrael – mimic

1

你也許可以試試這個:

df = pd.DataFrame({'A':[0,1,0,1,0],'B':[10,5,2,16,10]}, index=[0,1,0,1,0]) 
df2 = df.ix[0]/df.ix[0].sum() 
df3 = df.ix[1]/df.ix[1].sum() 

希望這將幫幫我。

+0

感謝你的努力。請參閱更新後的帖子。 – mimic