[Pandas] 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']| age | bin |
|---|---|
| 5 | child |
| 17 | child |
| 25 | young |
| 35 | adult |
| 55 | senior |
| 80 | senior |
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 비교
| 항목 | cut | qcut |
|---|---|---|
| 분할 기준 | 값 (예: 0 | 빈도 (각 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…
💬 댓글