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()
이 데이터를 groupby 로 집계하려면, 집계의 기준이 될 column이 필요하다.
나는 위 프레임에 column 하나를 추가하여 "태그" 라 부르려 한다.
# groupby용 태그 컬럼 추가
df['tag'] = 0 # 임시로 0으로 초기화
이 태그 컬럼에, 각 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]
위와 같이 데이터 프레임의 길이와 동일한 크기의 리스트가 있으면,
그 리스트를 데이터 프레임에 바로 추가/대입할 수 있다.
리스트는 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) 보다 작은 숫자를 첫번째 범위에 포함할 것인가에 대한 플래그이다.
'Python' 카테고리의 다른 글
iPad에서 Python 배우기 - Carnet 모듈 설치하기 (0) | 2023.03.18 |
---|---|
Pandas : 데이터 집계 - 주간 집계하기, string -> datetime 타입변환 (0) | 2021.11.28 |
Python : 확률 이항 검정 (0) | 2021.04.11 |
Pandas : 데이터 필터링하기 #2 (열 단위 데이터 추출) (0) | 2021.01.29 |
Pandas : 데이터 필터링하기 #1 (행 단위 데이터 추출) (0) | 2021.01.29 |