2017-11-01 14 views
1

두 가지 범주 변수 (예 : 도시 및 색상), 백분율이있는 열 및 가중치가있는 팬더 데이터 프레임이 있습니다. 도시와 색상의 크로스 탭을 만들고 싶습니다.이 두 가지 조합에 대해 퍼크의 가중 평균을 보여줍니다.pandas crosstab : 가중 평균을 계산하는 방법은 무엇입니까? 행 및 열 합계를 추가하는 방법은 무엇입니까?

나는 아래에있는 코드에서 먼저 가중치 x perc을 가진 열을 만든 다음, (가중치 x 퍼크)의 합계를 가진 하나의 크로스 탭과 가중치의 합계를 갖는 다른 크로스 탭을 작성하여 마지막으로 나눕니다 첫 번째는 두 번째.

작동하지만, 이 더 빠르고 우아한 방법입니까? 감사!

import pandas as pd 
import numpy as np 
np.random.seed(123) 
df=pd.DataFrame() 
myrows=10 
df['weight'] = np.random.rand(myrows)*100 

np.random.seed(321) 
df['perc']=np.random.rand(myrows) 
df['weight x perc']=df['weight']*df['perc'] 
df['colour']=np.where(df['perc']<0.5, 'red','yellow') 

np.random.seed(555) 
df['city']=np.where(np.random.rand(myrows) <0.5,'NY','LA') 


num=pd.crosstab(df['city'], df['colour'], values=df['weight x perc'], aggfunc='sum', margins=True) 
den=pd.crosstab(df['city'], df['colour'], values=df['weight'], aggfunc='sum', margins=True) 

out=num/den 

print(out) 

답변

3

여기서 apply() 및 numpy 가중 평균법을 사용하여 groupby를 사용합니다.

colour  red yellow 
city      
LA  0.173870 0.865636 
NY  0.077912 0.687400 

내가 비록 마진에 모든이없는 준다

df.groupby(['colour','city']).apply(lambda x: np.average(x.perc, weights=x.weight)).unstack(level=0) 

.

이 합계 ​​여전히 단일 프레임

+0

감사로 포장하지

df.groupby(['colour']).apply(lambda x: np.average(x.perc, weights=x.weight)) df.groupby(['city']).apply(lambda x: np.average(x.perc, weights=x.weight)) 

허가를 생성합니다. 나는 총계가 필요해, 나의 접근은 더 쉬울지도 모르다. –