Python

Pandas : 데이터 집계 - 범위로 그룹화 하기

Sorting 2021. 8. 30. 21:40
반응형

Pandas 에서 데이터를 집계할 때, 

범위 (0~10까지, 10~100까지, 100~1000까지... 등등) 로 데이터를 그룹화 하여

집계하는 방법을 정리해본다.

 

일단 간단한 더미데이터를 준비한다.

import random

data = [random.randint(0, 10000) for e in range(1000)]

 

위 데이터로 프레임을 만들어준다.

 

import pandas as pd

df = pd.DataFrame(data, columns=['value'])
df.head()

 

DataFrame head

 

이 데이터를 groupby 로 집계하려면, 집계의 기준이 될 column이 필요하다.

나는 위 프레임에 column 하나를 추가하여 "태그" 라 부르려 한다.

# groupby용 태그 컬럼 추가
df['tag'] = 0 # 임시로 0으로 초기화

 

tag column 추가

 

이 태그 컬럼에, 각 value 가 속하는 그룹값이 들어가 있으면 될 것이다.

(0~10 이면 10, 10~100 이면 100.. 등)

 

간단히 다음과 같은 함수를 통해, 각 value의 그룹값을 구할 수 있도록 한다.

def find_group(value):
    groups = [0, 10, 100, 1000, 10000]
    for i in range(len(groups)):
        if value < groups[i]:
            if i == 0:
                return 0
            
            return groups[i-1]

이 부분은 value 가 어떤 범위로 그룹화 되느냐에 따라 달라지므로

용도에 따라 find_group 함수를 수정하면 된다.

 

이제 그룹 지정 함수(find_group)을 통해 각 value 에 tag를 달아본다.

# groupby용 태그 컬럼 추가
df['tag'] = [find_group(e) for e in df.value]

value 에 따른 tag 추가

 

위와 같이 데이터 프레임의 길이와 동일한 크기의 리스트가 있으면,

그 리스트를 데이터 프레임에 바로 추가/대입할 수 있다.

리스트는 list comprehension 으로 생성했다.

 

이제 groupby를 통해 tag 컬럼으로 집계하면 된다.

# 그룹 별 개수 집계
df.groupby('tag').count()

# 그룹 별 평균 집계
df.groupby('tag').mean()

 

그룹 별 개수/평균 집계 결과

 

위와 같이 간단히 범위 집계를 할 수 있다.

 

 

위와 같이 값을 카테고라이징 하는 기능은 이미 판다스에 구현되어있다.

해당 메서드는 pandas.cut() 으로, 다음과 같이 사용할 수 있다.

import random
import pandas as pd

df = pd.DataFrame([random.randint(0, 10000) for e in range(1000)], columns=['data'])
groups = [1, 10, 100, 1000, 10000]
group_names = [1, 10, 100, 1000]

df['tag'] = pd.cut(x=df.data,
      bins=groups,
       labels=group_names,
      include_lowest=True)

bins 보다 label 수가 하나 더 적어야 한다.

include_lowest 는 경계 최소값(1) 보다 작은 숫자를 첫번째 범위에 포함할 것인가에 대한 플래그이다.

 

반응형