Skip to main content
범주형 컬럼을 object로 계속 유지하면 메모리 사용량이 커지고, 정렬/그룹 연산 비용도 증가합니다. category를 적절히 적용하면 메모리와 성능을 동시에 개선할 수 있습니다.

언제 category를 쓰는가

  • 고유값 수가 상대적으로 적은 문자열 컬럼
  • 고정된 등급 체계(예: bronze/silver/gold)
  • 반복 그룹 집계가 많은 컬럼

기본 적용

before = df.memory_usage(deep=True).sum()

df["region"] = df["region"].astype("category")
df["segment"] = pd.Categorical(
    df["segment"],
    categories=["A", "B", "C"],
    ordered=True,
)

after = df.memory_usage(deep=True).sum()
print(f"memory saved: {(before - after)/1024**2:.2f} MB")

카테고리 연산

# 코드값 접근 (정수 인코딩)
print(df["region"].cat.codes.head())

# 카테고리 추가/삭제
df["segment"] = df["segment"].cat.add_categories(["D"])
df["segment"] = df["segment"].cat.remove_unused_categories()

주의할 점

  • 너무 고유값이 많은 컬럼(예: UUID)은 category 이점이 거의 없습니다.
  • 카테고리 순서를 지정하지 않으면 정렬 결과가 기대와 다를 수 있습니다.
  • train/test를 분리해서 변환하면 카테고리 집합이 달라져 오류가 발생할 수 있습니다.

운영 기준

  1. 카디널리티 비율(nunique / row_count)이 낮은 컬럼부터 적용합니다.
  2. 모델 학습 파이프라인에서 카테고리 스키마를 고정합니다.
  3. 주기적으로 remove_unused_categories()를 수행해 메모리를 회수합니다.

이어서 볼 문서