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

[Pandas] get_dummies / from_dummies

· 수정 · 📖 약 1분 · 284자/단어 #python #pandas #encoding #one-hot
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
indexBusanDaeguSeoul
0FFT
1TFF
2FTF
3FFT

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_dummiesOneHotEncoder
학습/추론 일관성새 데이터에 카테고리 없으면 컬럼 mismatchfit 시 카테고리 기록, 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…

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

💬 댓글

사이트 검색 / 명령어

검색

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