2016-12-30 8 views
1

Pandas에서 동일한 데이터 집합에 대해 다중 단계/순차 집계를 수행하는 방법은 무엇입니까? 마치 각 단계가 다음 단계의 "하위 쿼리"인 것처럼 말입니다.Pandas DataFrame의 다중 단계 집계

내가 같이 SQL에서 생각할 수

:

import pandas 
import numpy 

numpy.random.seed(1) 
df = pandas.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 
          'foo', 'bar', 'foo', 'foo'], 
        'B' : ['one', 'one', 'two', 'three', 
          'two', 'two', 'one', 'three'], 
        'C' : numpy.random.randn(8), 
        'D' : numpy.random.randn(8)}) 

나는 집계 시도했다 :

SELECT x.A, COUNT(x.B) as B_COUNT, SUM(x.C_SUM) as C_SUM 
FROM (
    SELECT df.A, df.B, SUM(df.C) as C_SUM 
    FROM df 
    GROUP BY df.A, df.B 
) x 
GROUP BY x.A 

Python3.4와 Pandas0.19.2에서 작업은,이 같은 dataframe이 A, B 레벨로 이동 한 다음 해당 데이터 프레임에서 작업합니다 (즉, 인덱스는 'C'이고 열은 키 목록에 없으므로 'A'는 KeyError를 던집니다.)

A_B_AGG = df.groupby(['A','B']).C.sum().to_frame() 
A_B_AGG.keys() 
#Index(['C'], dtype='object') 
#Would like to do this, but throws KeyError 
end_result = A_B_AGG.groupby('A').B.size() 

궁극적으로, 나는

A B_COUNT  C_SUM 
bar  3 -3.986264 
foo  3 2.945186 

이 일의 적절한, 팬더 방법에 대한 의견을 주셔서 감사합니다처럼 보이는 뭔가 ...

을 얻어야한다!

답변

1

당신은 agg 기능을 사용할 수 있습니다 :

df.groupby('A').agg({'B': pandas.Series.nunique, 'C': 'sum'}) 

#    C B 
#A  
#bar -3.986264 3 
#foo  2.945186 3 

나는이 당신의 SQL 쿼리와 동일하다고 생각하는 이유는 당신이 열 A와 B에 의해 그룹을 수행 할 때, 다음 각 B의 어떤 중복이 없을 것입니다 그룹. 따라서 A로 그룹화 된 B의 수는 A로 그룹화 된 B의 고유 수와 같습니다. C sum의 경우 하위 그룹의 합계가 그룹의 총합과 동일합니다.


이것은 제가 위의 방법 논리적으로 동일 생각하여 SQL 쿼리를 직접 번역 :

(df.groupby(['A', 'B']).C.sum().reset_index() 
    .groupby('A').agg({'B': 'count', 'C': 'sum'})) 

#    C B 
# A  
#bar -3.986264 3 
#foo  2.945186 3 
+0

당신은'C.sum()가'무슨 일이 다른 컬럼에 어떻게합니까? 'D' 칼럼은 어떻게됩니까? groupby를 할 때 소수의 컬럼을 집계하고 다른 컬럼을 남겨 둘 수 있습니까? – MYGz

+1

@MYGz 무시됩니다. groupby (...)를 할 때 C는 그룹 변수와 함께 C 열을 선택했다는 의미입니다. – Psidom

+0

감사합니다. 그래서 다른 컬럼에서 다른 종류의 집계를 원한다면'.agg()'를 사용해야합니다. – MYGz

관련 문제