2017-10-18 4 views
0

나는 crosstab을 3 개의 변수 (position, offer, group)로 만들었습니다. 변수 1 개 (offer)의 합계를 백분율로 계산할 수 있지만 여백이 아닌 (즉, 열 기준으로 정규화) 것은 어떻게됩니까?고 차원 크로스 탭에서 백분율을 계산합니다

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

안양

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

다른 단계를 열을 따라 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 (level = [0, 1], axis = 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']