본문으로 건너뛰기
김신건의 로그

[Pandas] cut / qcut

· 수정 · 📖 약 1분 · 236자/단어 #python #pandas #binning #cut #qcut
Pandas cut / qcut, Pandas cut, Pandas qcut, binning pandas

정의

  • pd.cut(s, bins) : 값 기반 binning (구간을 직접 지정)
  • pd.qcut(s, q) : 빈도 기반 binning (분위수로 같은 크기)

연속형 변수를 범주형으로 변환. ML 의 feature engineering, 통계 보고서에 자주 사용.

cut, 값 기반

pd.cut(s, bins=[0, 18, 30, 50, 100])
pd.cut(s, bins=4)                      # 같은 간격 4 구간 자동
pd.cut(s, bins=[0,18,30,50,100], labels=['child','young','adult','senior'])
python
import pandas as pd
ages = pd.Series([5, 17, 25, 35, 55, 80])
print(pd.cut(ages, bins=[0, 18, 30, 50, 100],
  labels=['child','young','adult','senior']).tolist())
결과
['child', 'child', 'young', 'adult', 'senior', 'senior']
agebin
5child
17child
25young
35adult
55senior
80senior

qcut, 빈도 기반

pd.qcut(s, q=4)                       # 4분위 (각 25%)
pd.qcut(s, q=10, labels=False)        # 십분위, 정수 라벨
pd.qcut(s, q=[0, 0.5, 0.9, 1.0])      # 사용자 지정 quantile
python
import pandas as pd
scores = pd.Series([60, 65, 70, 75, 80, 85, 90, 95])
print(pd.qcut(scores, q=4, labels=['Q1','Q2','Q3','Q4']).tolist())
결과
['Q1', 'Q1', 'Q2', 'Q2', 'Q3', 'Q3', 'Q4', 'Q4']

각 그룹에 같은 수의 원소.

cut vs qcut 비교

항목cutqcut
분할 기준값 (예: 018, 1830)빈도 (각 25%)
그룹 크기다를 수 있음같음 (대략)
적합절대 기준 (나이, 가격대)상대 기준 (분위수, 등급)

right / include_lowest

pd.cut(s, bins=[0, 18, 30], right=True)        # (left, right]
pd.cut(s, bins=[0, 18, 30], right=False)       # [left, right)
pd.cut(s, bins=[0, 18, 30], include_lowest=True)   # 가장 작은 구간이 [0, ...]

기본 right=True(0, 18]. 경계값이 어느 쪽에 들어가는지 명확히.

retbins (bin 경계도 반환)

bins_arr, edges = pd.qcut(s, q=4, retbins=True)
# 새 데이터에 같은 경계 적용 가능
pd.cut(new_s, bins=edges)

결과 활용

# 카테고리 dtype 반환
result = pd.cut(s, bins=[0, 18, 30, 50])
result.dtype                  # CategoricalDtype
result.value_counts()         # 각 구간의 빈도

# 정수 라벨이 필요하면
pd.cut(s, bins=4, labels=False)    # 0, 1, 2, 3

자주 쓰는 패턴

연령대별 통계

df['age_group'] = pd.cut(df['age'], bins=[0, 18, 30, 50, 100],
    labels=['미성년','청년','중년','노년'])
df.groupby('age_group')['spending'].mean()

동일 빈도 분위수 등급

df['percentile'] = pd.qcut(df['score'], q=10, labels=False)
# 0 ~ 9 의 십분위 라벨

사용자 정의 quantile

pd.qcut(df['price'], q=[0, 0.25, 0.5, 0.75, 0.9, 1.0],
    labels=['cheap','low','mid','high','luxury'])

함정

1. NaN 처리

pd.cut(s, bins=...)
# NaN 은 NaN 카테고리로 유지

2. duplicates (qcut)

pd.qcut(s, q=4)
# 데이터가 한 값에 몰려 있으면 quantile 경계 중복 → ValueError
pd.qcut(s, q=4, duplicates='drop')   # 중복 경계 자동 제거

3. labels 의 길이

pd.cut(s, bins=[0, 18, 30, 50], labels=['a','b','c'])
# bins n+1 개, labels n 개
# 잘못 맞추면 ValueError

참고

이 글의 용어 (3개)
[Pandas] Categoricalpandas
정의 Categorical 은 제한된 고유값 만 가질 수 있는 dtype. 내부적으로 정수 코드로 저장되어 메모리 절약 과 속도 향상. 사용 <CodeWithOutput lang…
[Pandas] groupbypandas
정의 는 데이터를 그룹으로 나누고 (split), 각 그룹에 함수를 적용 (apply), 결과를 합쳐 (combine) 새 DataFrame 으로 만드는 split-apply-c…
[Pandas] value_countspandas
정의 는 각 고유값의 등장 빈도 를 내림차순 Series 로 반환. SQL 의 . pandas 1.1+ 부터는 도 가능 (여러 컬럼 조합). 기본 <CodeWithOutput l…

이 개념을 다룬 위키 페이지 (1)

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기