2013-11-21 3 views
15

여러 개의 "값"열이있는 피벗 테이블을 생성하려고 시도하고있었습니다. 나는 내가 원하는 방식으로 값을 집계하기 위해 aggfunc를 사용할 수 있다는 것을 알고 있지만 두 열을 모두 합하거나 평균 싶지는 않지만 대신 다른 열의 평균을 구하는 동안 한 열 합계를 원한다. 그래서 팬더를 사용하는 것이 가능합니까?팬다 피봇 테이블의 각 값 열에 대해 aggfunc을 정의합니다.

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.mean) 

가 어떻게 D에 대한 합계를 얻을 E에 대한 의미 할 수있다 :

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.sum) 

그리고이 평균을 위해 :

df = pd.DataFrame({ 
      'A' : ['one', 'one', 'two', 'three'] * 6, 
      'B' : ['A', 'B', 'C'] * 8, 
      'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 
      'D' : np.random.randn(24), 
      'E' : np.random.randn(24) 
}) 

지금이 피벗 합계 테이블을받을 수 있습니까?

희망 사항은 분명합니다.

답변

19

할 수 있습니다 이 CONCAT DataFrames :

>>> df1 = pd.pivot_table(df, values=['D'], rows=['B'], aggfunc=np.sum) 
>>> df2 = pd.pivot_table(df, values=['E'], rows=['B'], aggfunc=np.mean) 
>>> pd.concat((df1, df2), axis=1) 
      D   E 
B      
A 1.810847 -0.524178 
B 2.762190 -0.443031 
C 0.867519 0.078460 

또는 기능aggfunc 매개 변수로 다음 인덱싱의 당신이 할 수있는 패스 목록 :

>>> df3 = pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=[np.sum, np.mean]) 
>>> df3 
     sum    mean   
      D   E   D   E 
B           
A 1.810847 -4.193425 0.226356 -0.524178 
B 2.762190 -3.544245 0.345274 -0.443031 
C 0.867519 0.627677 0.108440 0.078460 
>>> df3 = df3.ix[:, [('sum', 'D'), ('mean','E')]] 
>>> df3.columns = ['D', 'E'] 
>>> df3 
      D   E 
B      
A 1.810847 -0.524178 
B 2.762190 -0.443031 
C 0.867519 0.078460 

Alghouth, 그것을 가지고 좋은 것 각 열에 대해 개별적으로 aggfunc을 정의하는 옵션. 어떻게 할 수 있었는지 모른다.과 같이 aggfunc dict-like 매개 변수로 전달 될 수있다.

갱신 사실, 당신의 경우에 당신은 손으로 피벗 할 수 있습니다

>>> df.groupby('B').aggregate({'D':np.sum, 'E':np.mean}) 
      E   D 
B      
A -0.524178 1.810847 
B -0.443031 2.762190 
C 0.078460 0.867519 
+1

감사합니다. 두 가지 방법 모두 사용할 수 있습니다. 그러나 내가 얻고 싶었던 것은 약간의 한 걸음이었습니다. 각 개별 열에 대해 함수를 정의 할 수 있다고 말했던 것처럼. 다른 사람이 그런 식으로 알고 있으면 잠시 기다려서 내가 잠시 동안 당신을 대답으로 받아 들일 것입니다. –

+0

@VIKASHJAISWAL 세 번째 방법을 참조하십시오, 이것이 당신이 필요로하는 것 같아요 –

+0

우수. 정확하게 내가 찾고 있던 것은 사실 다중 컬럼뿐만 아니라 df.groupby ([ 'B', 'C'])에 의해 그룹화하기 위해서입니다. 집계 ({ 'D': np.sum, 'E': np. 평균}). 노력해 주셔서 감사합니다. –

40

당신은 DICT를 전달하여 특정 컬럼에 특정 기능을 적용 할 수 있습니다.

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc={'D':np.sum, 'E':np.mean}) 
+3

아주 좋은 답변입니다. 표시된 대답과 비교하면 우아합니다. – whytheq

관련 문제