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 문제 GH18366 및 GH26512 에 대한 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
'IT' 카테고리의 다른 글
리디렉션 후 Google 개발자 도구 '네트워크'탭이 지워짐 (0) | 2020.09.01 |
---|---|
Java 스위치 내에서 변수 선언 및 초기화 (0) | 2020.09.01 |
C ++ 03 throw () 지정자 C ++ 11 noexcept의 차이점 (0) | 2020.09.01 |
Python에서 링크를 열거 형으로 변환 (0) | 2020.09.01 |
서버에 동일한 Windows 서비스의 여러 인스턴스 설치 (0) | 2020.09.01 |