[Pandas] get_dummies / from_dummies
Pandas get_dummies, 원-핫 인코딩, one-hot pandas
정의
pd.get_dummies(df) 는 범주형 컬럼을 원-핫 인코딩 (one-hot encoding). ML 전처리의 가장 흔한 단계.
기본
python
import pandas as pd
df = pd.DataFrame({'city': ['Seoul','Busan','Daegu','Seoul']})
print(pd.get_dummies(df['city'])) 결과
Busan Daegu Seoul
0 False False True
1 True False False
2 False True False
3 False False True| index | Busan | Daegu | Seoul |
|---|---|---|---|
| 0 | F | F | T |
| 1 | T | F | F |
| 2 | F | T | F |
| 3 | F | F | T |
DataFrame 전체
pd.get_dummies(df) # 모든 object/category 컬럼 자동 인코딩
pd.get_dummies(df, columns=['city', 'plan']) # 특정 컬럼만
prefix / sep
pd.get_dummies(df['city'], prefix='city')
# 컬럼: city_Busan, city_Daegu, city_Seoul
drop_first
pd.get_dummies(df['city'], drop_first=True)
# 첫 카테고리 제거 (n-1 컬럼)
# 회귀 모델의 multicollinearity 방지
dtype 지정
pd.get_dummies(df, dtype='int8') # bool 대신 int (메모리 효율)
pd.get_dummies(df, dtype='uint8')
pandas 2.x 기본은 bool. ML 라이브러리 호환을 위해 int 권장.
sparse 옵션
pd.get_dummies(df, sparse=True)
# 희소 행렬, 메모리 크게 절약 (특히 카테고리 多)
from_dummies (역변환, pandas 2.0+)
dummies = pd.get_dummies(df['city'], prefix='city')
restored = pd.from_dummies(dummies, sep='_')
# 다시 단일 컬럼 city 로
scikit-learn 의 OneHotEncoder 와의 비교
| 항목 | pd.get_dummies | OneHotEncoder |
|---|---|---|
| 학습/추론 일관성 | 새 데이터에 카테고리 없으면 컬럼 mismatch | fit 시 카테고리 기록, transform 시 일관 |
| 미지의 카테고리 | 에러 또는 누락 | handle_unknown=‘ignore’ |
| pipeline 통합 | ✗ | ✓ (sklearn Pipeline) |
| 간편성 | ✓ | △ |
탐색/분석 에는 get_dummies, 프로덕션 ML 에는 OneHotEncoder.
자주 쓰는 패턴
학습 / 테스트 일관성 유지
# 학습 시 카테고리 저장
train_cols = pd.get_dummies(train_df).columns
# 테스트 시 같은 컬럼으로 reindex
test_encoded = pd.get_dummies(test_df).reindex(columns=train_cols, fill_value=0)
MultiLabel 인코딩
df = pd.DataFrame({'tags': [['python', 'pandas'], ['python']]})
dummies = df['tags'].str.join('|').str.get_dummies(sep='|')
# python pandas
# 1 1
# 1 0
str.get_dummies 가 list/multilabel 에 적합.
함정
1. unique 카테고리가 너무 많음
pd.get_dummies(df['user_id']) # ❌ 수만 컬럼 폭증
ID 같은 high-cardinality 컬럼은 인코딩하지 말 것.
2. NaN 처리
pd.get_dummies(df, dummy_na=True)
# NaN 도 별도 컬럼 (None 이라는 의미가 있을 때)
기본은 NaN 행에 모두 0.
3. 학습/추론 컬럼 불일치
위의 reindex 패턴이 표준 해결.
참고
이 글의 용어 (3개)
- [Pandas] Categoricalpandas
- 정의 Categorical 은 제한된 고유값 만 가질 수 있는 dtype. 내부적으로 정수 코드로 저장되어 메모리 절약 과 속도 향상. 사용 <CodeWithOutput lang…
- [Pandas] mode / factorizepandas
- 정의 - : 가장 빈번한 값 (최빈값) 반환 - : 고유값을 정수 코드로 변환 (label encoding) mode <CodeWithOutput language="python"…
- [Pandas] replace / astypepandas
- 정의 - : 특정 값을 다른 값으로 치환 - : dtype 변환 replace 기본 <CodeWithOutput language="python" outputLanguage="te…
💬 댓글