Pandas GroupBy.agg ()를 사용하여 동일한 열의 여러 집계


127

여러 번 호출하지 않고 f1, f2동일한 열에 두 개의 다른 집계 함수 를 적용하는 pandas 기본 제공 방법이 있습니까?df["returns"]agg()

데이터 프레임의 예 :

import pandas as pd
import datetime as dt

pd.np.random.seed(0)
df = pd.DataFrame({
         "date"    :  [dt.date(2012, x, 1) for x in range(1, 11)], 
         "returns" :  0.05 * np.random.randn(10), 
         "dummy"   :  np.repeat(1, 10)
}) 

구문 적으로 잘못되었지만 직관적으로 올바른 방법은 다음과 같습니다.

# Assume `f1` and `f2` are defined for aggregating.
df.groupby("dummy").agg({"returns": f1, "returns": f2})

분명히 Python은 중복 키를 허용하지 않습니다. 입력을 표현하는 다른 방법이 agg()있습니까? 아마도 튜플 목록이 [(column, function)]더 잘 작동하여 동일한 열에 여러 함수를 적용 할 수 있습니까? 하지만 agg()사전 만받는 것 같습니다.

내부의 두 기능을 모두 적용하는 보조 기능을 정의하는 것 외에 이에 대한 해결 방법이 있습니까? (어쨌든 집계와 어떻게 작동합니까?)



2
0.25 이후부터 Pandas는 여러 집계에 대해보다 직관적 인 구문을 제공하고 출력 열의 이름을 변경합니다. Named Aggregations 에 대한 문서를 참조하십시오 .
cs95

참고로이 질문은
2012

1
참고로 받아 들여지는 답변도 더 이상 사용되지 않습니다. agg () dicts를 전달하지 마십시오.
cs95

@ cs95 : 나는 그것이 더 이상 사용되지 않는다는 것을 알고 있습니다. 나는 SO가 이전 버전의 오래된 오래된 솔루션으로 흩어져 있다고 말합니다. 그래서 주석 외에는 표시하는 방법이 없습니다.
smci

답변:


159

함수를 목록으로 간단히 전달할 수 있습니다.

In [20]: df.groupby("dummy").agg({"returns": [np.mean, np.sum]})
Out[20]:         
           mean       sum
dummy                    
1      0.036901  0.369012

또는 사전으로 :

In [21]: df.groupby('dummy').agg({'returns':
                                  {'Mean': np.mean, 'Sum': np.sum}})
Out[21]: 
        returns          
           Mean       Sum
dummy                    
1      0.036901  0.369012

4
결과 열 이름을 지정하는 방법이 있습니까?
Ben

3
@Ben 나중에 이름 바꾸기를 사용해야한다고 생각합니다. 예 : Tom Augspurger (25 번 셀 참조)
Stewbaca 16.

1
@Ben

10
@sparc_spread 여러 함수를 목록으로 전달하는 것은 pandas 문서에 잘 설명되어 있습니다 . 여러 함수의 이름을 바꾸고 사전으로 전달하는 것은 이후 버전의 pandas에서 더 이상 사용되지 않습니다. 자세한 내용은 0.20 변경 로그 에 있으며, 다른 곳 에서도 요약했습니다 .
joelostblom

3
이미 언급되었지만 출력 열의 이름을 age에서 바꾸는 데 사전을 사용하는 것은 더 이상 사용되지 않습니다. 대신 튜플 목록을 지정할 수 있습니다. 이 답변을 참조하십시오.
cs95

101

TLDR; Pandas groupby.agg에는 (1) 여러 열에 대한 집계 및 (2) 열에 대한 여러 집계를 지정하기위한 새롭고 더 쉬운 구문이 있습니다. 따라서 pandas> = 0.25 에 대해 이렇게하려면

df.groupby('dummy').agg(Mean=('returns', 'mean'), Sum=('returns', 'sum'))

           Mean       Sum
dummy                    
1      0.036901  0.369012

또는

df.groupby('dummy')['returns'].agg(Mean='mean', Sum='sum')

           Mean       Sum
dummy                    
1      0.036901  0.369012

Pandas> = 0.25 : 명명 된 집계

Pandas는 GroupBy.agg명명 된 집계를 지정하기위한보다 직관적 인 구문을 위해 의 동작을 변경했습니다 . 개선 사항 및 관련 GitHub 문제 GH18366GH26512 대한 0.25 문서 섹션을 참조하십시오 .

문서에서

출력 열 이름을 제어하여 열별 집계를 지원하기 위해 pandas는에서 GroupBy.agg()"명명 된 집계"라는 특수 구문을 허용합니다 . 여기서

  • 키워드는 출력 열 이름입니다.
  • 값은 첫 번째 요소가 선택할 열이고 두 번째 요소가 해당 열에 적용 할 집계 인 튜플입니다. Pandas는 pandas.NamedAgg namedtuple에 [ 'column', 'aggfunc'] 필드를 제공하여 인수가 무엇인지 명확하게합니다. 평소와 같이 집계는 호출 가능 또는 문자열 별칭 일 수 있습니다.

이제 키워드 인수를 통해 튜플을 전달할 수 있습니다. 튜플은 (<colName>, <aggFunc>).

import pandas as pd

pd.__version__                                                                                                                            
# '0.25.0.dev0+840.g989f912ee'

# Setup
df = pd.DataFrame({'kind': ['cat', 'dog', 'cat', 'dog'],
                   'height': [9.1, 6.0, 9.5, 34.0],
                   'weight': [7.9, 7.5, 9.9, 198.0]
})

df.groupby('kind').agg(
    max_height=('height', 'max'), min_weight=('weight', 'min'),)

      max_height  min_weight
kind                        
cat          9.5         7.9
dog         34.0         7.5

또는 pd.NamedAgg더 명시 적으로 만드는 (본질적으로 명명 된 튜플)을 사용할 수 있습니다 .

df.groupby('kind').agg(
    max_height=pd.NamedAgg(column='height', aggfunc='max'), 
    min_weight=pd.NamedAgg(column='weight', aggfunc='min')
)

      max_height  min_weight
kind                        
cat          9.5         7.9
dog         34.0         7.5

Series의 경우 더 간단합니다. aggfunc를 키워드 인수에 전달하면됩니다.

df.groupby('kind')['height'].agg(max_height='max', min_height='min')    

      max_height  min_height
kind                        
cat          9.5         9.1
dog         34.0         6.0       

마지막으로 열 이름이 유효한 파이썬 식별자가 아닌 경우 압축을 푼 사전을 사용하십시오.

df.groupby('kind')['height'].agg(**{'max height': 'max', ...})

판다 <0.25

0.24까지의 최신 버전의 Pandas에서는 집계 출력에 대한 열 이름을 지정하기 위해 사전을 사용하는 경우 다음이 표시됩니다 FutureWarning.

df.groupby('dummy').agg({'returns': {'Mean': 'mean', 'Sum': 'sum'}})
# FutureWarning: using a dict with renaming is deprecated and will be removed 
# in a future version

열 이름을 바꾸는 데 사전을 사용하는 것은 v0.20에서 더 이상 사용되지 않습니다. 최신 버전의 pandas에서는 튜플 목록을 전달하여 더 간단하게 지정할 수 있습니다. 이 방법으로 함수를 지정하면 모든 해당 열의 함수는 (이름, 함수) 쌍의 튜플로 지정되어야합니다.

df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})

        returns          
            op1       op2
dummy                    
1      0.328953  0.032895

또는,

df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])

            op1       op2
dummy                    
1      0.328953  0.032895

4
최신 버전의 인터페이스를 사용하는 더 명확하고 깨끗한 솔루션을 사용하기 때문에 이것이 최고의 대답이되어야합니다.
NKSHELL

명명 된 집계에 사용 된 예는 동일한 열에 여러 집계를 사용하는 원래 문제를 해결하지 못합니다. 예를 들어,에 대한 첫 번째 부분 설정없이 높이에 대해 최소 및 최대로 집계 할 수 df.groupby('kind')['height']있습니까?
빅터

1
@victor 질문을 직접적으로 해결하는 답변 상단에 TLDR을 추가했습니다. 두 번째 질문에 대한 대답은 '예'입니다. 제 답변에 대한 수정 사항을 살펴보십시오.
cs95

이와 같이 여러 열 집계를 처리하기 위해> = 0.25 답변의 마지막 예제에 대한보다 일반적인 코드는 훌륭했을 것입니다. df.groupby("kind").agg(**{ 'max height': pd.NamedAgg(column='height', aggfunc=max), 'min weight': pd.NamedAgg(column='weight', aggfunc=min) })
Onur Ece

6

이 작업을 원하십니까 :

In [7]: df.groupby('dummy').returns.agg({'func1' : lambda x: x.sum(), 'func2' : lambda x: x.prod()})
Out[7]: 
              func2     func1
dummy                        
1     -4.263768e-16 -0.188565

2
아니요, 작동하지 않습니다. 문서 문자열을 aggregate보면 a dict가 전달 될 때 키가 열 이름이어야 한다고 명시 적으로 말합니다 . 따라서 귀하의 예제는이 오류를 확인하지 않고 입력 한 것이거나 Pandas가 여기에서 자체 문서를 손상시킵니다.
ely

N / MI는 returns거기에 대한 추가 호출을 보지 못했습니다 . 이것이 집합체의 시리즈 버전입니까? DataFrame 버전의 집계를 수행하려고하며 한 번에 각 열에 여러 다른 집계를 적용하려고합니다.
ely

1
시도해보십시오 : df.groupby ( 'dummy'). agg ({ 'returns': { 'func1': lambda x : x.sum (), 'func2': lambda x : x.mean ()}})
Chang 그녀

메시지없이 어설 션 오류를 제공합니다. 코드 (pandas.core.internals.py, 행 406-408, 버전 0.7.3)의 모양에서 보면 첫 번째에있는 키보다 더 많은 열을 반환하지 않는지 확인하기 위해 마지막에 확인하는 것처럼 보입니다. 집계 사전의 계층.
ely

마스터에서 잘 작동합니다. 업데이트를 시도 하시겠습니까?
Chang She
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.