Skip to content

Pandas Pivot vs Melt: 데이터 리쉐이프 제대로 하기

Updated on

형태 변환은 분석·시각화 전의 병목이 되기 쉽습니다. 잘못 선택하면 행이 중복되거나 값이 유실되고, 지나치게 넓은 테이블이 만들어집니다.

PAS:

  • 문제: 지저분한 wide/long 데이터는 차트와 집계를 늦춘다.
  • 심화: 중복이 있는데 pivot을 쓰면 에러, melt를 잘못 쓰면 행이 과도하게 늘거나 ID가 사라진다.
  • 해결: tidy 흐름을 따르라—중복이 있으면 pivot_table, 키가 유일하면 pivot, long으로는 melt, MultiIndex 미세조정은 stack/unstack.

빠른 가이드

메서드변환 방향사용할 때중복 처리?
pivotlong → wide키가 유일할 때🚫 (중복 시 에러)
pivot_tablelong → wide집계 필요 또는 중복 존재aggfunc 로 처리
meltwide → long컬럼을 행으로 정규화N/A
stack / unstackwide ↔ long (인덱스 레벨)MultiIndex 조정N/A

예제 데이터

import pandas as pd
 
sales = pd.DataFrame({
    "region": ["NA", "NA", "EU", "EU"],
    "quarter": ["Q1", "Q2", "Q1", "Q2"],
    "product": ["A", "A", "A", "A"],
    "revenue": [120, 140, 110, 150],
    "units": [10, 11, 9, 12],
})

pivot으로 와이드 만들기

wide = sales.pivot(index="region", columns="quarter", values="revenue")
  • region + quarter 조합이 유일해야 한다.
  • 필요하면 .reset_index()로 플랫하게 만든다.

집계 포함 와이드 (pivot_table)

table = sales.pivot_table(
    index="region",
    columns="quarter",
    values="revenue",
    aggfunc="sum",
    margins=True,
    margins_name="Total"
)
  • 중복을 집계로 처리.
  • fill_value=0으로 빈 칸을 채워 깔끔하게 내보내기.

여러 값/집계

multi = sales.pivot_table(
    index="region",
    columns="quarter",
    values=["revenue", "units"],
    aggfunc={"revenue": "sum", "units": "mean"},
)

컬럼 평탄화:

multi.columns = [f"{metric}_{col}" for metric, col in multi.columns]
multi = multi.reset_index()

melt로 롱 만들기

long = sales.melt(
    id_vars=["region", "quarter"],
    value_vars=["revenue", "units"],
    var_name="metric",
    value_name="value",
)
  • tidy 데이터를 기대하는 시각화 라이브러리에 적합.
  • value_vars로 펼칠 컬럼 지정.

MultiIndex용 stack / unstack

stacked = table.stack()
unstacked = stacked.unstack()
  • 키를 다시 정의하지 않고 레벨을 재배치.
  • stack(level="quarter"), unstack(level=-1) 등으로 레벨 지정.

흔한 오류

문제해결
pivot에서 Index contains duplicate entries집계가 있는 pivot_table로 전환.
컬럼 순서가 이상함정렬: table = table.reindex(sorted(table.columns), axis=1).
MultiIndex 가독성이 낮음pivot_table 후 컬럼을 평탄화.
변환 후 결측이 많아짐fill_value 사용 또는 stack(dropna=False)로 빈칸 유지.

워크플로우 팁

  • 먼저 정규화: meltgroupby/aggpivot_table로 최종 형태 생성.
  • 차트에는 long 포맷이 편하고, wide는 보고서/내보내기에 적합.
  • pivot_tabletable.to_excel("report.xlsx")로 바로 출력 가능.

관련 가이드


핵심 정리

  • 키가 유일할 때는 pivot, 중복/집계가 필요하면 pivot_table, long 변환은 melt.
  • 복잡한 피벗 후에는 MultiIndex를 평탄화해 내보내기를 쉽게 한다.
  • Reshape를 groupby와 조합해 분석 준비 데이터를 빠르게 만든다.