itsource

panda GroupBy.agg()를 사용하여 동일한 열의 여러 애그리게이션

mycopycode 2023. 1. 15. 17:21
반응형

panda GroupBy.agg()를 사용하여 동일한 열의 여러 애그리게이션

팬더가 두 가지 다른 집계 기능을 적용할 수 있는 기본 제공 방법이 있습니까?f1, f2같은 컬럼으로df["returns"]전화할 필요 없이agg()여러 번?

데이터 프레임의 예:

import pandas as pd
import datetime as dt
import numpy as np

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()사전만 받아들이는 것 같아요.

이것에 대한 회피책은, 그 안에 있는 양쪽의 기능만을 적용하는 보조 기능을 정의하는 것 외에 있습니까(어느 쪽이든 집약에서는 어떻게 동작합니까?

2022-06-20 현재, 집계에 대해 다음과 같이 인정되고 있다.

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

다음 폴더는 의 이력 버전용으로 포함되어 있습니다.pandas.

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

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

TLDR; 판다groupby.agg에는 (1) 여러 컬럼의 집계를 지정하고 (2) 여러 컬럼의 집계를 지정하기 위한 보다 쉬운 새로운 구문이 있습니다.>= 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

판다 > = 0.25: 명명된 집합체

판다는 그들의 행동을 바꿨다.GroupBy.agg명명된 집계를 지정하기 위한 보다 직관적인 구문을 선호합니다.확장 및 관련된 GitHub 문제 GH18366GH26512에 대한 0.25 문서 섹션을 참조하십시오.

이 문서에서

출력 열 이름을 제어하여 열별 집계를 지원하기 위해 팬더는 다음 특수 구문을 받아들입니다.GroupBy.agg()이름 있는 집약(named aggregation)으로 알려져 있습니다.

  • 키워드는 출력 컬럼 이름입니다.
  • 값은 튜플이며 첫 번째 요소는 선택할 열이고 두 번째 요소는 해당 열에 적용할 집계입니다.판다는 판다를 제공한다.NamedAgg는 인수 내용을 알기 쉽게 하기 위해 필드 ['column', 'aggfunc']를 사용하여 tuple을 명명했습니다.통상과 같이, 집약에는 콜 가능 또는 문자열 에일리어스를 사용할 수 있습니다.

키워드 인수를 통해 태플을 전달할 수 있게 되었습니다.튜플은 다음 형식을 따릅니다.(<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       

마지막으로 열 이름이 유효한 python 식별자가 아닌 경우 사전에서 압축을 해제하십시오.

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

팬더 < 0.25

0하면 0.24의 팬더가 .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에서는 열의 이름을 변경하는 데 사전을 사용하는 것이 권장되지 않습니다.더 최근의 판다에서는, 이것은 더 간단하게 튜플의 목록을 전달함으로써 특정될 수 있다.함수를 이 방식으로 지정하는 경우 해당 열의 모든 함수를 (이름, 함수) 쌍의 튜플로 지정해야 합니다.

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

동일한 여러 집계 함수를 적용해야 하는 열이 여러 개 있는 경우 가장 간단한 방법(imo)은 사전 이해를 사용하는 것입니다.

#setup
df = pd.DataFrame({'dummy': [0, 1, 1], 'A': range(3), 'B':range(1, 4), 'C':range(2, 5)})

# aggregation
df.groupby("dummy").agg({k: ['sum', 'mean'] for k in ['A', 'B', 'C']})

멀티 인덱스

위의 경우 MultiIndex 컬럼을 가진 데이터 프레임이 생성됩니다.무계층 커스텀컬럼명이 필요한 경우는, 이름 있는 집약을 추천합니다(여기서의 다른 답변에서 제안되고 있습니다.

문서에서 설명한 바와 같이 키는 출력 컬럼 이름이고 값은 튜플이어야 합니다.(column, aggregation function)네스트 .열과 함수가 여러 개이므로 중첩 구조가 됩니다. 한하면 '사전에 쓸 수 있다'라는쓸 수 있습니다.collections.ChainMap()또는 네스트 루프입니다.

컬럼Grouter Column)을 dummy) 로 (인덱스 없음)을 합니다.as_index=Falsegroupby().

from collections import ChainMap
# convert a list of dictionaries into a dictionary
dct = dict(ChainMap(*reversed([{f'{k}_total': (k, 'sum'), f'{k}_mean': (k, 'mean')} for k in ['A','B','C']])))
# {'A_total': ('A', 'sum'), 'A_avg': ('A', 'mean'), 'B_total': ('B', 'sum'), 'B_avg': ('B', 'mean'), 'C_total': ('C', 'sum'), 'C_avg': ('C', 'mean')}

# the same result obtained by a nested loop
# dct = {k:v for k in ['A','B','C'] for k,v in [(f'{k}_total', (k, 'sum')), (f'{k}_avg', (k, 'mean'))]}

# aggregation
df.groupby('dummy', as_index=False).agg(**dct)

평평한

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

반응형