728x90
반응형
Pandas 함수 중 groupby 함수는 Dataframe의 데이터를 원하는 칼럼으로 그룹화 하고 각종 연산을 하는데 사용하는 함수 입니다.
groupby 후 연산 함수를 통해 평균, 최대, 최소 등 기본적인 통계들은 쉽게 구할 수 있습니다.
padnas groupy의 내장 함수와 agg 함수를 통해 여러 통계치를 사용할 수 있습니다.
예제
- 데이터 셋 만들기
import pandas as pd
data = {'이름': ['홍길동', '홍길동', '홍길동', '아무개', '아무개', '아무개'],
'과목': ['영어', '수학', '국어', '영어', '수학', '국어'],
'성적': [80, 90, 70, 60, 85, 95]}
df
출력 값
이름 | 과목 | 성적 |
홍길동 | 영어 | 80 |
홍길동 | 수학 | 90 |
홍길동 | 국어 | 70 |
아무개 | 영어 | 60 |
아무개 | 수학 | 85 |
아무개 | 국어 | 95 |
mean, sum, std 등 다양한 통계값을 확인 할수 있습니다.
df.groupby('이름').mean('성적')
또는 df.groupby('이름').mean()
※ 컬럼명을 넣지 않으면 데이터프레임의 모든 숫자형 데이터 칼럼의 통계치를 볼 수 있습니다.
출력 값
성적 | |
이름 | |
홍길동 | 80.0 |
아무개 | 80.8 |
※ 데이터에 등수 추가
df['등수'] =[2, 1, 3, 3, 2, 1]
df
출력 값
이름 | 과목 | 성적 | 등수 |
홍길동 | 영어 | 80 | 2 |
홍길동 | 수학 | 90 | 1 |
홍길동 | 국어 | 70 | 3 |
아무개 | 영어 | 60 | 3 |
아무개 | 수학 | 85 | 2 |
아무개 | 국어 | 95 | 1 |
df.groupby('이름').mean()
출력 값
성적 | 등수 | |
이름 | ||
홍길동 | 80.0 | 2.0 |
아무개 | 80.8 | 2.0 |
- .agg() 로 여러 통계값을 한번에 추출 가능
df.groupby('이름').agg(['mean', 'var', 'std'])
출력 값
성적 | 등수 | |||||
mean | var | std | mean | var | std | |
이름 | ||||||
아무개 | 80.0 | 325.0 | 18.027756 | 2.0 | 1.0 | 1.0 |
홍길 | 80.0 | 100.0 | 10.000000 | 2.0 | 1.0 | 1.0 |
- .agg() 함수는 다양하게 이용이 가능합니다.
1. 컬럼별로 원하는 통계치를 다르게 할 수 있다.
- 성적은 mean을, 등수는 var과 std를 각각의 통계치를 구할 수 있다.
df.groupby('이름').agg({
'성적': 'mean',
'등수': ['var', 'std']
})
출력 값
성적 | 등수 | ||
mean | var | std | |
이름 | |||
아무개 | 80.0 | 1.0 | 1.0 |
홍길동 | 80.0 | 1.0 | 1.0 |
2. 통계치의 column명의 변경을 같이 할 수 있다.(tuple을 이용)
* 통계치 적용 함수를 list 형태로 작성해야 함
df.groupby('이름').agg({
'성적': [('평균','mean')],
'등수': [('분산','var'), ('표준편차', 'std')]
})
출력 값
성적 | 등수 | ||
평균 | 분산 | 표준편차 | |
이름 | |||
아무개 | 80.0 | 1.0 | 1.0 |
홍길동 | 80.0 | 1.0 | 1.0 |
3. lambda 함수를 통해 원하는 함수를 적용 할 수 있다.
df.groupby('이름')[['성적', '등수']].agg(lambda x: x.mean() / x.std())
# 또는 함수 선언 후 함수 사용
def mean_div_std(x) :
return x.mean() / x.std()
df.groupby('이름')[['성적', '등수']].agg(lambda x : mean_div_std(x))
출력 값
성적 | 등수 | |
이름 | ||
아무개 | 4.437602 | 2.0 |
홍길동 | 8.000000 | 2.0 |
groupby를 사용하면 multi index가 적용되어 두 줄로 header가 보여집니다.
이 경우 reset_index()를 사용하면 기존의 dataframe 형식과 동일하게 볼 수 있습니다.
df.groupby('이름')[['성적', '등수']].agg(lambda x: x.mean() / x.std()).reset_index()
출력 값
이름 | 성적 | 등수 | |
0 | 아무개 | 4.437602 | 2.0 |
1 | 홍길동 | 8.000000 | 2.0 |
728x90
반응형
'python > pandas 활용' 카테고리의 다른 글
pandas datetime, 숫자 타입 변환 (0) | 2023.08.13 |
---|---|
dataframe combine_first() - 두 DataFrame 합치기 (0) | 2022.08.30 |
pandas - pivot, pivot_table (0) | 2022.04.20 |
padnas(dataframe) 문자열이 포함된 column 가져오기 (0) | 2022.04.11 |