프로그래밍 언어/python 관련

[pandas] groupby 집계 함수 활용법 모음

code cleaner 2021. 8. 1. 16:32
반응형

데이터 프레임에서 집계하여 활용하는 다양한 방법 모음


활용 예시 데이터셋

import pandas as pd
import numpy as np
raw_data = {'id':['id1', 'id2', 'id3','id2', 'id3'],
            'data1':[34,12,5,45,67],
            'data2':[1234,3255,3245,4356,7032]}
df = pd.DataFrame(raw_data)
print(df)
>>> print(df)
    id  data1  data2
0  id1     34   1234
1  id2     12   3255
2  id3      5   3245
3  id2     45   4356
4  id3     67   7032

1. 간단한 집계

sum(), count(), min(), max(), mean(), median() 둥....

# 특정 컬럼(id) 하나를 기준으로 합계 구하기
print(df.groupby('id').sum())

>>> print(df.groupby('id').sum())
     data1  data2
id
id1     34   1234
id2     57   7611
id3     72  10277

# 여러 컬럼(id, data1) 순서대로 합계 구하기
print(df.groupby(['id', 'data1']).sum())
>>> print(df.groupby(['id', 'data1']).sum())
           data2
id  data1
id1 34      1234
id2 12      3255
    45      4356
id3 5       3245
    67      7032

2. 함수 여러 개를 한번에 집계하기

# 특정 컬럼(id)를 기준으로 최소값, 합계, 최대값 구하기
# 입력시 str, 함수명으로 모두 작성 가능함
print(df.groupby('id').aggregate([min, np.sum, 'max']))
>>> print(df.groupby('id').aggregate([min, np.sum, 'max']))
    data1         data2
      min sum max   min    sum   max
id
id1    34  34  34  1234   1234  1234
id2    12  57  45  3255   7611  4356
id3     5  72  67  3245  10277  7032

# 특정 컬럼(id)를 기준으로 컬럼 하나는 최소값, 다른 컬럼은 최대값 구하기
print(df.groupby('id').aggregate({'data1':'min', 'data2':'max'}))
>>> print(df.groupby('id').aggregate({'data1':'min', 'data2':'max'}))
     data1  data2
id
id1     34   1234
id2     12   4356
id3      5   7032

3. 특정 조건으로 집계하기

groupby에 조건 넣기filter 로 특정 조건의 데이터만 뽑기

apply 와 lambda 로 컬럼간 계산된 값 구하기

# 특정 컬럼이 특정 값 이상의 여부에 따라 집계하기
# data1이 60이상일때의 합계와 60미만일 때의 합계 구하기
print(df.groupby(df['data1'] > 60).sum())
>>> print(df.groupby('id').aggregate({'data1':'min', 'data2':'max'}))
     data1  data2
id
id1     34   1234
id2     12   4356
id3      5   7032

# 특정 컬럼이 특정 값 이상일 때의 데이터 추출하기
# data1이 60 이상일 때의 데이터 확인하기
def select_sixty_upper(x):
    return x['data1'] > 60
print(df.groupby('data1').filter(select_sixty_upper))
>>> print(df.groupby('data1').filter(select_sixty_upper))
    id  data1  data2
4  id3     67   7032

# 특정 컬럼을 기준으로 데이터들 간의 계산된 값 구하기
print(df.groupby('id').apply(lambda x : x.max() - x.min()))
>>> print(df.groupby('id').apply(lambda x : x.max() - x.min()))
     data1  data2
id
id1      0      0
id2     33   1101
id3     62   3787
반응형