
DataFrame.melt()란?
melt() 메서드는 스프레드시트와 같이 wide-form (or wide format) 로 정리된 데이터를 통계 분석이나 시각화에 적합한 long-form (or long format) 로 변환하는 데 사용.
이 과정은
마치 넓게 펼쳐진 시트를 녹여(melt)
길쭉한 막대 모양으로 만드는 것과 유사하여
해당 이름이 지어짐.
데이터 분석에서는 이 long form을 Tidy Data, Stacked Data 라고 부르기도 함.
Wide format 과 Long format 에 대한 좀 더 자세한 건 다음을 참고:
[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)를 구분하는 데 사용됨.
- parameter
- Value column (값 컬럼):
- paramter
value_vars로 지정. - row로 변환될 값들을 포함하는 column.
- 여기 column들의 이름(or label)은 반환값에서 새로운
'variable'컬럼(var_name)의 값으로 들어가고, - 그 안에 있던 값들은 반환값에서 새로운
'value'컬럼(value_name)으로 이동함.
- paramter
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_vars와 value_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_name과value_name을 지정하여- 새로운 컬럼의 이름을 '항목'과 '금액'으로 바꾸어 가독성을 높임.
melt()와 stack()의 차이점
melt()와 stack()은 모두 Wideform를 Longform로 바꾸지만, 작동 방식에서 차이점을 가짐.
melt():- 컬럼을 직접 지정하여 DataFrame 구조를 재편성함.
- MultiIndex를 사용하는 구조가 아니어도 사용할 수 있으며,
id_vars와value_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
'Python > pandas' 카테고리의 다른 글
| [Pandas] Boolean Mask 와 where()/mask() (1) | 2025.08.28 |
|---|---|
| [Pandas] index 와 columns- 관련 메서드: rename(), set_index(), reset_index() (0) | 2025.08.24 |
| [Pandas] missing value 확인: 결측치 확인 (0) | 2025.08.24 |
| [Pandas] unique(), value_counts(), nunique() (0) | 2025.08.23 |
| [Pandas] stack() 과 unstack() (0) | 2025.08.23 |