DevSSOM

파이썬 pandas - groupby 함수로 그룹으로 묶기 본문

Python/기초

파이썬 pandas - groupby 함수로 그룹으로 묶기

데브쏨 2021. 7. 26. 19:22
반응형

df.groupby()

간단한 집계를 넘어서서 조건부로 집계하고 싶은 경우, groupby 함수를 활용. groupby() 함수를 이용하면 키 값을 기준으로 그룹으로 묶을 수 있음. groupby() 함수의 사용 예시를 들자면, 시험 성적 데이터에서 각 반을 그룹으로 묶어 각 반의 평균 점수를 구할 수 있음.

import numpy as np
import pandas as pd

df = pd.DataFrame({
    'key' : ['A', 'B', 'C', 'A', 'B', 'C'],
    'data1' : [1, 2, 3, 1, 2, 3],
    'data2' : [4, 4, 6, 0, 6, 1]
})

# 데이터프레임
DataFrame:
  key  data1  data2
0   A      1      4
1   B      2      4
2   C      3      6
3   A      1      0
4   B      2      6
5   C      3      1 


# key 값으로 묶어서 합하기
df.groupby('key').sum()

# 결과값
     data1  data2
key              
A        2      4
B        4     10
C        6      7


# key, data1 값으로 묶어서 합하기 (계층적으로 groupby)
df.groupby(['key', 'data1']).sum()

# 결과값
           data2
key data1       
A   1          4
B   2         10
C   3          7

 

.aggregate()

합계라는 뜻으로, 한 번의 groupby를 통해서 여러 개의 통계 함수를 적용시키고 싶을 때 사용. aggregate() 함수를 이용하여 키값을 기준으로 그룹으로 묶은 결과의 요약 통계량을 구할 수 있음. aggregate() 함수의 결과값 또한 데이터프레임으로 반환되어 한 눈에 보기 편리함.

# 데이터프레임
DataFrame:
  key  data1  data2
0   A      1      4
1   B      2      4
2   C      3      6
3   A      1      0
4   B      2      6
5   C      3      1


df.groupby('key').aggregate([min, np.median, max])

# 결과값
    data1            data2           
      min median max   min median max
key                                  
A       1      1   1     0    2.0   4
B       2      2   2     4    5.0   6
C       3      3   3     1    3.5   6

key 컬럼으로 groupby를 하는데, aggregate의 코드 순서대로 min, np.median, max 함수를 함께 사용. 일반적인 집계함수의 'min'은 이렇게 따옴표 안에 입력해주고, 넘파이에 들어있는 함수는 np.median로 써주고, max는 판다스에 들어있는 집계함수이므로 따옴표 없이 사용할 수 있음.

 

df.groupby('key').aggregate({'data1' : 'min', 'data2' : np.sum})

# 결과값
     data1  data2
key              
A        1      4
B        2     10
C        3      7

key 컬럼으로 groupby를 하는데, aggregate로 data1은 min값을 찾고, data2에 대해서는 np.sum으로 합계를 구하겠다 해서 다른 함수를 groupby로 한 번에 사용할 수 있음. 이렇게 쓰면, 실전에서 함수를 여러 번 쓰지 않고도 하나의 표에 결과값이 나올 수 있음.

 

agregate 메소드에 함수를 매개변수로 넣어줄 때, min, max, mean, count 등의 특정 함수들은 문자열 형태로 넘겨줄 수 있음.

 

 

.filter()

groupby를 통해서 그룹의 속성을 기준으로 데이터를 필터링할 때 사용.

df = pd.DataFrame({
    'key' : ['A', 'B', 'C', 'A', 'B', 'C'],
    'data1' : [1, 2, 3, 1, 2, 3],
    'data2' : [4, 4, 6, 0, 6, 1]
})

# 데이터프레임
DataFrame:
  key  data1  data2
0   A      1      4
1   B      2      4
2   C      3      6
3   A      1      0
4   B      2      6
5   C      3      1 


df filter_by_mean(x):
    return x['data2'].mean() > 3

df.groupby('key').mean()   # groupby로 key값을 묶은 상태에서 평균값 구하기

# 결과값
     data1  data2
key              
A      1.0    2.0
B      2.0    5.0
C      3.0    3.5


df.groupby('key').filter(filter_by_mean)    # 위에서 만든 함수를 넣어줘서 필터링

# 결과값
  key  data1  data2
1   B      2      4
2   C      3      6
4   B      2      6
5   C      3      1

 

.apply()

groupby로 묶인 데이터에 함수를 적용할 때 사용.

df.groupby('key').apply(lambda x: x.max() - x.min())

# 결과값
     data1  data2
key              
A        0      4
B        0      2
C        0      5

key를 groupby로 묶은 상태에서, appply(lambda: ~ )) 식으로 적용. lambda는 x의 최대값에서 최소값을 뺀 값을 계산. 

 

 

.get_group()

groupby로 묶인 데이터에서 key값으로 데이터를 가져올 수 있음.

df = pd.read_csv("./univ.csv")

# 상위 5개 데이터
df.head()

# 데이터 추출
df.groupby("시도").get_group("충남")
len(df.groupby("시도").get_group("충남"))    # 94

 

 

728x90
반응형
댓글