Pandas Pivot vs Melt: 데이터 리쉐이프 제대로 하기
Updated on
형태 변환은 분석·시각화 전의 병목이 되기 쉽습니다. 잘못 선택하면 행이 중복되거나 값이 유실되고, 지나치게 넓은 테이블이 만들어집니다.
PAS:
- 문제: 지저분한 wide/long 데이터는 차트와 집계를 늦춘다.
- 심화: 중복이 있는데
pivot을 쓰면 에러,melt를 잘못 쓰면 행이 과도하게 늘거나 ID가 사라진다. - 해결: tidy 흐름을 따르라—중복이 있으면
pivot_table, 키가 유일하면pivot, long으로는melt, MultiIndex 미세조정은stack/unstack.
빠른 가이드
| 메서드 | 변환 방향 | 사용할 때 | 중복 처리? |
|---|---|---|---|
pivot | long → wide | 키가 유일할 때 | 🚫 (중복 시 에러) |
pivot_table | long → wide | 집계 필요 또는 중복 존재 | ✅ aggfunc 로 처리 |
melt | wide → long | 컬럼을 행으로 정규화 | N/A |
stack / unstack | wide ↔ 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)로 빈칸 유지. |
워크플로우 팁
- 먼저 정규화:
melt→groupby/agg→pivot_table로 최종 형태 생성. - 차트에는 long 포맷이 편하고, wide는 보고서/내보내기에 적합.
pivot_table후table.to_excel("report.xlsx")로 바로 출력 가능.
관련 가이드
핵심 정리
- 키가 유일할 때는
pivot, 중복/집계가 필요하면pivot_table, long 변환은melt. - 복잡한 피벗 후에는 MultiIndex를 평탄화해 내보내기를 쉽게 한다.
- Reshape를
groupby와 조합해 분석 준비 데이터를 빠르게 만든다.