2014-07-27 5 views
14

나는 Pandas의 데이터 프레임에 다양한 통계 계산을 집계하고 수행하는 기능을 작성하려고하지만 원래 데이터 프레임에 병합합니다. 문제가 발생했습니다.Pandas - GroupBy 다음 원본 테이블에 병합

SELECT EID, 
     PCODE, 
     SUM(PVALUE) AS PVALUE, 
     SUM(SQRT(SC*EXP(SC-1))) AS SC, 
     SUM(SI) AS SI, 
     SUM(EE) AS EE 
INTO foo_bar_grp 
FROM foo_bar 
GROUP BY EID, PCODE 

그리고 원래의 테이블에 조인 : 여기

SELECT * 
FROM foo_bar_grp INNER JOIN 
foo_bar ON foo_bar.EID = foo_bar_grp.EID 
     AND foo_bar.PCODE = foo_bar_grp.PCODE 

이 단계는 다음과 같습니다 >>

pol_dict = {'PID':[1,1,2,2], 
      'EID':[123,123,123,123], 
      'PCODE':['GU','GR','GU','GR'], 
      'PVALUE':[100,50,150,300], 
      'SI':[400,40,140,140], 
      'SC':[230,23,213,213], 
      'EE':[10000,10000,2000,30000], 
      } 


pol_df = DataFrame(pol_dict) 

pol_df 
: 데이터 IN
로딩이 SQL의 코드와 동일

OUT : >>

EID EE PCODE PID PVALUE SC SI 
0 123 10000 GU 1  100 230 400 
1 123 10000 GR 1  50 23 40 
2 123 2000 GU 2  150 213 140 
3 123 30000 GR 2  300 213 140 

2 단계 : 데이터 계산 및 그룹화 다음과 같이

내 팬더 ​​코드는 다음과 같습니다

#create aggregation dataframe 
poagg_df = pol_df 
del poagg_df['PID'] 
po_grouped_df = poagg_df.groupby(['EID','PCODE']) 

#generate acc level aggregate 
acc_df = po_grouped_df.agg({ 
    'PVALUE' : np.sum, 
    'SI' : lambda x: np.sqrt(np.sum(x * np.exp(x-1))), 
    'SC' : np.sum, 
    'EE' : np.sum 
}) 

내가 원래 테이블에 가입 할 때까지 잘 작동 :

입력 : >>

po_account_df = pd.merge(acc_df, po_df, on=['EID','PCODE'], how='inner',suffixes=('_Acc','_Po')) 

OUT : >> KeyError : u'n o EID라는 항목 '

어떤 이유로 그룹화 된 데이터 프레임을 원래 테이블에 다시 조인 할 수 없습니다. groupby 열을 실제 열로 변환하는 방법을 살펴 봤지만 작동하지 않는 것 같습니다.

pol_acc_df['PVALUE_PCT'] = np.round(pol_acc_df.PVALUE_Po/pol_acc_df.PVALUE_Acc,4) 

감사 :

주의는, 최종 목표는 각 열의 비율 (유의 확률, SI, SC, EE) IE를 찾을 수있을 것입니다!

답변

31

기본적으로 groupby 출력에는 그룹화 열이 표시가 아닌 열로되어있어 병합이 실패하는 이유입니다.

두 가지 다른 방법으로 처리 할 수 ​​있습니다. 아마도 groupby 객체를 정의 할 때 as_index 매개 변수를 사용하는 것이 가장 쉽습니다.

po_grouped_df = poagg_df.groupby(['EID','PCODE'], as_index=False) 

그런 다음 병합이 예상대로 작동해야합니다.

In [356]: pd.merge(acc_df, pol_df, on=['EID','PCODE'], how='inner',suffixes=('_Acc','_Po')) 
Out[356]: 
    EID PCODE SC_Acc EE_Acc  SI_Acc PVALUE_Acc EE_Po PVALUE_Po \ 
0 123 GR  236 40000 1.805222e+31   350 10000   50 
1 123 GR  236 40000 1.805222e+31   350 30000  300 
2 123 GU  443 12000 8.765549e+87   250 10000  100 
3 123 GU  443 12000 8.765549e+87   250 2000  150 

    SC_Po SI_Po 
0  23  40 
1 213 140 
2 230 400 
3 213 140