python/pandas 활용

pandas groupby() 활용 - 데이터 그룹화

Memory! 2024. 3. 9. 21:01
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
반응형