본문 바로가기
목차
Python/pandas

[Pandas] melt() 메서드

by ds31x 2025. 8. 24.
728x90
반응형

https://medium.com/@u.praneel.nihar/part2-melt-pivot-and-pivot-table-18764f92a57

DataFrame.melt()란?

melt() 메서드는 스프레드시트와 같이 wide-form (or wide format) 로 정리된 데이터를 통계 분석이나 시각화에 적합한 long-form (or long format) 로 변환하는 데 사용.

이 과정은
마치 넓게 펼쳐진 시트를 녹여(melt)
길쭉한 막대 모양으로 만드는 것과 유사하여
해당 이름이 지어짐.

 

데이터 분석에서는 이 long form을 Tidy Data, Stacked Data 라고 부르기도 함.

 

Wide format 과 Long format 에 대한 좀 더 자세한 건 다음을 참고:

https://ds31x.tistory.com/521#4.-long-format-vs-wide-format-%EB%A7%8E%EC%9D%B4-%EC%93%B0%EC%9D%B4%EB%8A%94-%EC%9A%A9%EC%96%B4%EC%99%80%EC%9D%98-%EC%97%B0%EA%B2%B0

 

[Term] pivot 이란?

1. pivot 이란?Pandas에서 pivot은 데이터의 모양(shape)을 바꾸는 기능 을 가리킴: reshaping특정 column의 값들을 row 인덱스(index)로,또 다른 column의 값들을 열(columns)로지정하는 테이블을 만들고, 해당 조합

ds31x.tistory.com

 


melt()의 핵심 개념

melt()는 원본 DataFrame의 columns를 다음 두 가지 종류의 column으로 구분하여 reshaping

  • Identifier column (식별자 컬럼):
    • parameter id_vars 로 지정.
    • 변환 후에도 계속 유지되는 고정된 column.
    • 데이터의 개별 obervation (or record)를 구분하는 데 사용됨.
  • Value column (값 컬럼):
    • paramter value_vars 로 지정.
    • row로 변환될 값들을 포함하는 column.
    • 여기 column들의 이름(or label)은 반환값에서 새로운 'variable' 컬럼(var_name)의 값으로 들어가고,
    • 그 안에 있던 값들은 반환값에서 새로운 'value' 컬럼(value_name)으로 이동함.

melt()의 주요 파라미터

DataFrame.melt(
    id_vars=None, 
    value_vars=None, 
    var_name=None, 
    value_name='value',
    )
  • id_vars :
    • 필수적이지는 않지만 가장 중요한 Parameter로 거의 지정됨.
    • 유지할 identifier columns label을 문자열 또는 리스트 형태로 지정.
    • 만약 생략하면 모든 컬럼이 value columns 변환됨: 이 경우 원본에서의 단일 observation 이 완전히 분리되기 때문에 주의할 것 .
  • value_vars :
    • (선택 사항) 행으로 변환할 value columns의 이름(label)을 리스트 형태로 지정.
    • 이 parameter를 생략하면 id_vars에 지정되지 않은 모든 columns가 value columns로 자동으로 변환됨.
  • var_name :
    • (선택 사항) value_vars의 컬럼 이름(label)들이 새롭게 담길 column의 label(=이름).
    • 기본값 None 이며 이 경우 내부적으로 'variable'입으로 해당 column label 설정.
  • value_name :
    • (선택 사항) value_vars 컬럼의 값들이 새롭게 담길 column의 label(=이름).
    • 기본값은 'value'입니다.

Example : 매출 및 비용 데이터 변환하기

다음과 같은 각 도시별로 2021년과 2022년의 매출과 비용 데이터가 한 행에 모두 들어있는 wideform DataFrame 객체임.

import pandas as pd

# 넓은 형식의 데이터프레임 생성
df_wide_financial = pd.DataFrame({
    '도시': ['서울', '부산', '대구'],
    '매출_2021': [1000, 800, 750],
    '비용_2021': [500, 420, 380],
    '매출_2022': [1200, 950, 880],
    '비용_2022': [600, 480, 410]
})

print("초기 DataFrame:")
print(df_wide_financial)

위의 코드에 의한 초기 DataFrame 객체는 다음과 같음:

도시 매출_2021 비용_2021 매출_2022 비용_2022
서울 1000 500 1200 600
부산 800 420 950 480
대구 750 380 880 410

Ex 1: 모든 컬럼을 변환하기 (인자 없이 사용)

id_varsvalue_vars를 모두 지정하지 않으면, melt()는 모든 컬럼을 value column으로 간주하여 변환.

 

이 경우, 모든 데이터가 하나의 'variable' 컬럼과 'value' 컬럼으로 reshaping.
(이는 보통 의도한 결과가 아닐 수 있으므로, 최소한 하나의 식별자 컬럼은 지정하는 것이 .)

# 인자를 하나도 넘기지 않고 melt()를 호출
df_long_no_args = df_wide_financial.melt()
print(df_long_no_args)

 

결과는 다음과 같음:

  variable value
0 도시 서울
1 도시 부산
2 도시 대구
3 매출_2021 1000
... ... ...
13 비용_2022 480
14 비용_2022 410

Ex 2: '도시' 컬럼만 identifier로 사용하기

이 데이터에서 '도시' 컬럼은 identifier이므로 id_vars로 지정하고, 나머지 columns는 모두 value columns로 변환.

value_vars를 따로 지정하지 않으면 id_vars를 제외한 모든 컬럼이 자동으로 변환됨.

# `value_vars`를 생략하고 `id_vars`만 지정
df_long_all = df_wide_financial.melt(id_vars=['도시'])
print(df_long_all)

 

결과:

  도시 variable value
0 서울 매출_2021 1000
1 부산 매출_2021 800
... ... ... ...
10 부산 비용_2022 480
11 대구 비용_2022 410

Ex 3: 특정 column만 선택하여 변환하기

만약 '매출' 데이터만 변환하고 싶다면 value_vars를 명시적으로 지정할 수 있음 (일반적인 경우임).

# '매출' 컬럼만 선택하여 변환
df_long_sales = df_wide_financial.melt(
    id_vars=['도시'],
    value_vars=['매출_2021', '매출_2022'],
    var_name='항목',
    value_name='금액'
)

print(df_long_sales)

결과는 다음과 같음:

  도시 항목 금액
0 서울 매출_2021 1000
1 부산 매출_2021 800
2 대구 매출_2021 750
3 서울 매출_2022 1200
4 부산 매출_2022 950
5 대구 매출_2022 880
  • var_namevalue_name을 지정하여
  • 새로운 컬럼의 이름을 '항목'과 '금액'으로 바꾸어 가독성을 높임.

melt()와 stack()의 차이점

melt()stack()은 모두 Wideform를 Longform로 바꾸지만, 작동 방식에서 차이점을 가짐.

  • melt():
    • 컬럼을 직접 지정하여 DataFrame 구조를 재편성함.
    • MultiIndex를 사용하는 구조가 아니어도 사용할 수 있으며, id_varsvalue_vars를 명확히 명시적으로 분리함.
  • stack():
    • 주로 MultiIndex (or 계층적 인덱스)를 가진 DataFrame에서
    • 컬럼 인덱스의 한 레벨을 row index 로 옮기는 데 사용됩니다.

melt()는 일반적인 상황에서 가장 많이 사용되며, 직관적으로 데이터의 형태를 바꿀 수 있다는 장점을 가짐.

2025.08.23 - [Python/pandas] - [Pandas] stack() 과 unstack()

 

[Pandas] stack() 과 unstack()

stack():DataFrame의 columns(컬럼)을 rows(행)로 변환하여Wide format(넓은 형태)을 Long format(긴 형태)으로 만드는 메서드unstack():MultiIndex의 특정 level(레벨)을 columns(컬럼)으로 변환하여Long format(긴 형태)을 Wid

ds31x.tistory.com


같이 보면 좋은 자료들

2025.05.16 - [Python/pandas] - [ML] pandas.DataFrame 에서 EDA에 적합한 메서드 요약

 

[ML] pandas.DataFrame 에서 EDA에 적합한 메서드 요약

Pandas DataFrame에서 탐색적 데이터 분석(EDA)에 사용할 수 있는 주요 메서드들은 다음과 같음:2024.05.18 - [분류 전체보기] - [ML] Exploratory Data Analysis (EDA) [ML] Exploratory Data Analysis (EDA)Exploratory Data Analysis (

ds31x.tistory.com


 

728x90