[Pandas] melt
Pandas melt, DataFrame.melt, pd.melt, wide-to-long
정의
DataFrame.melt() 는 Pandas pivot 의 역방향. wide-format → long-format 변환. 여러 컬럼을 두 컬럼 (variable, value) 으로 합친다.
장기간 시계열 데이터나 시각화 (ggplot, seaborn) 입력에 적합.
시각화
기본
python
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'math': [90, 80],
'english': [85, 75],
'science': [95, 70],
})
melted = df.melt(id_vars='name', var_name='subject', value_name='score')
print(melted) 결과
name subject score
0 Alice math 90
1 Bob math 80
2 Alice english 85
3 Bob english 75
4 Alice science 95
5 Bob science 70Before (wide):
| name | math | english | science | |
|---|---|---|---|---|
| 0 | Alice | 90 | 85 | 95 |
| 1 | Bob | 80 | 75 | 70 |
After (long):
| name | subject | score | |
|---|---|---|---|
| 0 | Alice | math | 90 |
| 1 | Bob | math | 80 |
| 2 | Alice | english | 85 |
| 3 | Bob | english | 75 |
| 4 | Alice | science | 95 |
| 5 | Bob | science | 70 |
파라미터
| 파라미터 | 의미 |
|---|---|
id_vars | 유지할 컬럼 (key) |
value_vars | melt 할 컬럼 (생략 시 id_vars 외 모두) |
var_name | melt 된 컬럼 이름 (기본 ‘variable’) |
value_name | 값 컬럼 이름 (기본 ‘value’) |
ignore_index | True (기본) 면 새 index, False 면 원본 유지 |
일부 컬럼만 melt
df.melt(
id_vars=['name', 'grade'],
value_vars=['math', 'english'],
var_name='subject',
value_name='score',
)
# science 는 빠짐
시각화 라이브러리와의 궁합
import seaborn as sns
melted = df.melt(id_vars='name', var_name='subject', value_name='score')
sns.barplot(data=melted, x='subject', y='score', hue='name')
# long format 이라 seaborn 이 쉽게 그룹화
pivot 과의 역관계
# wide → long
melted = df.melt(id_vars='name', var_name='subject', value_name='score')
# long → wide (원래대로)
wide = melted.pivot(index='name', columns='subject', values='score')
stack 과 비교
# 비슷한 결과지만 구조가 다름
df.set_index('name').stack()
# MultiIndex Series (name, subject) → value
melt 는 결과를 컬럼화 한다 (subject, score 컬럼). stack 은 MultiIndex 화.
자주 만나는 패턴
1. 와이드 데이터를 long 으로 → 시계열 차트
df = pd.DataFrame({
'date': ['2024-01', '2024-02'],
'product_a': [100, 110],
'product_b': [200, 220],
})
df.melt(id_vars='date', var_name='product', value_name='sales')
2. 설문 응답 데이터
# 컬럼이 question1, question2, ... 인 경우
survey.melt(id_vars=['respondent_id'], var_name='question', value_name='answer')
함정
1. value_vars 안 주면 모든 비-id 컬럼 melt
df.melt(id_vars='name') # math, english, science 모두 melt
원치 않은 컬럼 (예: timestamp) 도 묶일 수 있다.
2. 결과 행 수 폭증
# 1000 행 × 10 melt 컬럼 = 10,000 행
큰 데이터에서 melt 후 분석은 메모리 주의.
3. var_name 의 default 가 ‘variable’
명시적으로 이름 주는 것이 가독성에 좋다.
참고
이 글의 용어 (3개)
- [Pandas] pivotpandas
- 정의 는 long-format → wide-format 변환. 한 열의 고유 값들이 새 컬럼이 되고, 원래 데이터는 그 자리에 배치된다. 집계가 없으므로 같은 (index, co…
- [Pandas] pivot_tablepandas
- 정의 는 의 확장. 집계 함수를 동반 해 중복 (index, columns) 도 처리. Excel 의 피벗 테이블과 가장 가까운 기능. 기본 <CodeWithOutput lang…
- [Pandas] stack / unstackpandas
- 정의 - : 가장 안쪽 컬럼 레벨 → 행 레벨 (DataFrame → Series 또는 더 좁은 DataFrame) - : 가장 안쪽 행 레벨 → 컬럼 레벨 / 의 MultiIn…
💬 댓글