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

[Pandas] melt

· 수정 · 📖 약 1분 · 332자/단어 #python #pandas #reshape #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     70

Before (wide):

namemathenglishscience
0Alice908595
1Bob807570

After (long):

namesubjectscore
0Alicemath90
1Bobmath80
2Aliceenglish85
3Bobenglish75
4Alicescience95
5Bobscience70

파라미터

파라미터의미
id_vars유지할 컬럼 (key)
value_varsmelt 할 컬럼 (생략 시 id_vars 외 모두)
var_namemelt 된 컬럼 이름 (기본 ‘variable’)
value_name값 컬럼 이름 (기본 ‘value’)
ignore_indexTrue (기본) 면 새 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 컬럼). stackMultiIndex 화.

자주 만나는 패턴

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…

💬 댓글

사이트 검색 / 명령어

검색

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