IT

Pandas GroupBy.agg ()를 사용하여 동일한 열의 여러 가지 상품

lottoking 2020. 9. 1. 07:44
반응형

Pandas GroupBy.agg ()를 사용하여 동일한 열의 여러 가지 상품


다음 (완전히 과잉) 데이터 프레임 예제

import pandas as pd
import datetime as dt
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)
})

agg여러 번 호출 할 필요 없이 동일한 열에 두 개의 다른 존재하는 함수를 적용하는 기존 기본 제공 방법이 ?

구문은 잘못 조립으로 올바른 방법은 다음과 같습니다.

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

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

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


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

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

dummy                    
1      0.285833  0.028583

또는 사전으로 :

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

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

시리즈의 경우 더 간단합니다. 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

이 작업을 원하십니까 :

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

참고 URL : https://stackoverflow.com/questions/12589481/multiple-aggregations-of-the-same-column-using-pandas-groupby-agg

반응형