2017-10-18 17 views
0

私はcrosstabを3つの変数(position,offer,group)で作成しました。 1つの変数offerの合計で割合を計算するにはどうすればよいですか?高次元クロス集計のパーセンテージを計算

df = pd.crosstab(df.group, [df.position, df.offer], margins = True) 

DF

pid offer position group 
1 accept left  group1 
1 accept left  group1 
1 accept right  group2 
1 reject right  group2 
1 reject right  group1 
2 reject right  group1 
2 reject left  group2 
2 accept left  group3 
3 accept right  group3 
3 reject right  group1 
3 reject right  group2 

私の現在のクロス集計:

position   left     right   All 
offer   accept reject accept reject   
group1   2   0   0  3  5 
group2   0   1   1  2  4 
group3   1   0   1  0  2 
All   3   1   2  5  11 

予想結果:

position   left     right 
offer   accept reject accept reject  
group1   1  0   0  1 
group2   0  1   0.33  0.66 
group3   1  0   1  0 

ありがとう!

+1

「df」はどのように見えますか? –

答えて

1

groupbyを0列目に追加し、csumで割ります。

c = pd.crosstab(df.group, [df.position, df.offer]) 
df = c/c.groupby(level=0, axis=1).sum() 
print(df) 

position left   right   
offer accept reject accept reject 
group          
group1  1.0 0.0 0.000000 1.000000 
group2  0.0 1.0 0.333333 0.666667 
group3  1.0 0.0 1.000000 0.000000 

あなたは私はと完璧主義の多くをしている場合は、整数として、全体の数字をお勧めします、あなたはこのようにそれを行うことができます。

df = c.div(c.groupby(level=0, axis=1).sum()).astype(object) 
print(df) 

position left   right   
offer accept reject accept reject 
group          
group1  1  0   0   1 
group2  0  1 0.333333 0.666667 
group3  1  0   1   0 
+0

@COLDSPEED、どのようにしてグループ化できますか? 'groupby([level = 0、level = 1]、axis = 1)'は動作していないようです。ありがとう! – Kay

+1

@Kay 'groupby(レベル= [0、1]、軸= 1)' –

0

あなたは

を使用することができますあなたはまた、を持っている可能性が
In [4013]: dfa = df.groupby(['group', 'position', 'offer']).size().unstack(fill_value=0) 

In [4014]: dfa.div(dfa.sum(axis=1), axis=0).unstack() 
Out[4014]: 
offer accept   reject 
position left  right left  right 
group 
group1  1.0 0.000000 0.0 1.000000 
group2  0.0 0.333333 1.0 0.666667 
group3  1.0 1.000000 0.0 0.000000 

また、pivot_tableからのも同様である。

df.pivot_table(index=['group', 'position'], columns='offer', aggfunc=len)['pid'] 
関連する問題