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 문제 GH18366 및 GH26512에 대한 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=False
groupby()
.
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
'itsource' 카테고리의 다른 글
Persistent LocalDateTimeAsString이 DateTimeParseException이 되다 (0) | 2023.01.15 |
---|---|
행을 열로 피벗 (0) | 2023.01.15 |
WAMPServer의 Windows 명령줄에서 PHP를 실행하는 방법 (0) | 2023.01.15 |
Cent에서 MariaDB Galera 클러스터의 멀티 마스터 복제를 구성하는 방법OS 6 (0) | 2023.01.15 |
Lodash를 사용하여 객체의 키를 필터링하려면 어떻게 해야 합니까? (0) | 2023.01.15 |