본문으로 바로가기

pandas melt(): 와이드 데이터를 롱 포맷으로 변환하는 최선의 방법

pandas.melt()로 DataFrame을 와이드에서 롱 포맷으로 재구성하는 방법을 실용 예제와 일반적인 사용 사례와 함께 알아보세요.
업데이트됨 2026년 8월 4일  · 8분 읽다

AI로 탐색하기

ChatGPT에서 열기Claude에서 열기Perplexity에서 열기

와이드 포맷은 읽기에는 편하지만, 많은 분석 및 시각화 작업은 롱 포맷의 데이터에서 더 잘 작동합니다.

pandas.melt() 함수는 하나 이상의 열을 행으로 변환하면서 선택한 식별자 열은 그대로 유지하여 DataFrame의 형태를 바꿉니다. 이를 통해 데이터를 더 쉽게 필터링, 그룹화, 시각화, 분석할 수 있습니다.

이 튜토리얼에서는 pandas.melt() 함수를 사용하는 방법을 보여 드립니다. 또한 pivot(), stack(), wide_to_long()와의 차이점도 함께 살펴보겠습니다. 파이썬을 처음 시작하신다면, 데이터 타입, 리스트, 기본 함수, 패키지와 같은 기술을 다루는 our Introduction to Python course를 수강해 보시길 권장합니다.

pandas.melt() 사용 방법

pandas.melt() 함수는 열 머리글을 새 열의 값으로 변환하여 DataFrame을 와이드 포맷에서 롱 포맷으로 변환합니다.

문법은 다음과 같습니다:

pandas.melt(
    frame,
    id_vars=None,
    value_vars=None,
    var_name=None,
    value_name="value",
    col_level=None,
    ignore_index=True
)

각 인수의 의미는 다음과 같습니다.

  • frame: 재구성할 DataFrame. pandas.melt()를 사용할 때에만 필요합니다.

  • id_vars: 그대로 유지할 열 또는 열 목록. 재구성 후 각 행을 식별합니다.

  • value_vars: 언피벗할 열 또는 열 목록. 생략하면 pandas는 id_vars에 없는 모든 열을 melt합니다.

  • var_name: 원래 열 이름을 저장할 새 열의 이름. 지정하지 않으면 기본값은 ”variable”입니다.

  • value_name: 값을 저장할 새 열의 이름. 지정하지 않으면 기본값은 ”value”입니다.

  • col_level: 선택 사항으로, MultiIndex 열에서 melt할 레벨을 지정합니다.

  • ignore_index: True(기본값)이면 새 순차 인덱스를 생성합니다. False이면 기존 인덱스를 보존합니다.

위 문법이 데이터를 어떻게 바꾸는지 예제로 보여 드리겠습니다.

아래처럼 각 제품의 월별 매출이 별도 열에 저장된 데이터셋이 있다고 가정해 보겠습니다.

와이드 포맷의 DataFrame 예시.

pandas.melt()를 사용하여 월 열을 행으로 변환할 수 있습니다.

# Convert the DataFrame from wide format to long format
products_sales_2025_melted = products_sales_2025.melt(
    # Keep the Product and Category columns unchanged
    id_vars=["Product", "Category"],

    # Convert the month columns into rows
    value_vars=["January", "February", "March", "April", "May", "June"],

    # Name of the new column that stores the original column names
    var_name="Month",

    # Name of the new column that stores the corresponding sales values
    value_name="Sales"
)

# Display the reshaped DataFrame
products_sales_2025_melted.head(10)

결과 DataFrame은 이제 각 월이 개별 행으로 저장됩니다.

pandas.melt()를 사용해 롱 포맷으로 변환된 DataFrame

자주 사용하는 pandas.melt() 예제

이제 pandas.melt() 문법이 어떻게 작동하는지 이해했으니, 각 매개변수가 개별적으로 어떻게 동작하는지 살펴보겠습니다. 다음 예제에서는 위의 표를 사용합니다. 

선택한 열만 melt하기

value_vars 매개변수를 사용하면 언피벗할 열을 지정할 수 있습니다. 모든 월을 melt하는 대신 필요한 열만 변환할 수 있습니다.

이 예제에서는 January와 February 열만 melt하고, 나머지 월 열은 무시합니다.

# Convert only the January and February columns into rows
product_sales_3month = products_sales_2025.melt(
    id_vars="Product",
    value_vars=["January", "February",]
)

product_sales_3month.head(20)

pandas.melt()로 선택한 열만 melt하기

식별자 열 유지하기

id_vars 매개변수를 사용하여 일부 열을 그대로 유지하고 나머지 열만 재구성할 수 있습니다.

아래 예제에서는 “Product”와 “Category”는 그대로 두고, 월별 매출 열을 행으로 변환합니다.

# Keep the Product and Category columns while melting the monthly sales
product_sales_cat = products_sales_2025.melt(
    id_vars=["Product", "Category"]
)

product_sales_cat.head()

pandas.melt() 함수로 식별자 열을 유지하는 방법.

출력 열 이름 바꾸기

보시다시피 기본 출력 열 이름은 variablevalue입니다. var_namevalue_name 인수를 사용해 더 설명적인 이름으로 바꿀 수 있습니다.

예를 들어, 아래 출력에서는 variable 열을 “Month”, value를 “Sales”로 변경했습니다.

# Keep the Product and Category columns while melting the monthly sales
# Rename Month and Sales columns
product_sales_cat = products_sales_2025.melt(
    id_vars=["Product", "Category"],
    var_name="Month",
    value_name="Sales"
)

product_sales_cat.head()

pandas.melt() 함수에서 var_name과 value_name으로 출력 열 이름 바꾸기.

원래 인덱스 보존하기

기본적으로 pandas.melt()는 새로운 순차 인덱스를 생성합니다. 원래 행 인덱스를 유지하려면 ignore_index=False로 설정하세요.

# Keep the original row index after reshaping
product_sales_index = products_sales_2025.melt(
    id_vars=["Product", "Category"],
    var_name="Month",
    value_name="Sales",
    ignore_index=False
)

product_sales_index.head(10)

pandas.melt()에서 ignore_index=False로 원래 인덱스 보존하기.

위 예제에서는 새로운 순차 인덱스로 대체되지 않고, 원래 행 레이블(0–5)이 월별로 반복됩니다.

pandas.melt()를 언제 사용해야 하나요?

pandas.melt()는 와이드 포맷의 데이터를 분석이나 시각화를 위해 롱 포맷으로 변환해야 할 때 유용합니다. 또한 다음과 같은 사용 사례에서 특히 중요합니다.

  • 와이드 데이터를 롱 포맷으로 변환: 많은 데이터셋이 관련 값을 여러 열에 걸쳐 저장합니다. 이런 포맷은 읽기에는 편하지만 분석을 어렵게 만들 수 있습니다. pandas.melt()는 이러한 열을 식별자 열을 보존한 채 단일 열로 합쳐, 후속 처리에 더 깔끔한 구조를 제공합니다.

  • 시각화를 위한 데이터 준비: Seaborn 같은 많은 시각화 라이브러리는 차트 작성 시 롱 포맷 데이터에서 가장 잘 작동합니다. 여러 열을 수동으로 결합하는 대신 pandas.melt()로 해당 라이브러리가 기대하는 포맷으로 쉽게 재구성할 수 있습니다.

  • 통계 분석을 위한 데이터 준비: groupby(), 집계, 필터링, 요약 통계 등 많은 pandas 연산은 측정값이 여러 열에 흩어져 있는 것보다 단일 열에 저장되어 있을 때 더 간단해집니다. pandas.melt()로 데이터를 재구성하면 다양한 변수를 분석하는 데 필요한 코드량을 줄일 수 있습니다.

  • 정돈된(tidy) 데이터셋 만들기: 정돈된 데이터셋은 각 변수를 각자의 열에, 각 관측값을 각자의 행에 저장합니다. 데이터셋에 여러 열에 반복 측정값이 있다면, pandas.melt()가 이를 정돈된 포맷으로 바꾸는 가장 빠른 방법인 경우가 많습니다.

파이썬에서 산점도, 카운트 플롯, 막대, 박스 플롯 등 다양한 차트를 만들고 커스터마이즈하는 방법은 Introduction to Data Visualization with Seaborn 코스에서 배울 수 있습니다.

pandas.melt()와 다른 재구성 함수 비교

Pandas는 각기 다른 목적의 데이터 재구성 함수를 제공합니다. 각 메서드의 차이를 살펴보겠습니다.

pandas.melt() vs. pivot()

아래 표는 pandas.melt()pivot() 함수의 차이를 보여줍니다.ons.

melt()

pivot()

와이드 데이터를 롱 데이터로 변환합니다.

롱 데이터를 와이드 데이터로 변환합니다. 

열을 행으로 바꿉니다. 

행의 값을 열로 바꿉니다.

분석 및 시각화를 위한 데이터 준비에 유용합니다.

보고서에서 데이터를 요약하거나 제시하는 데 유용합니다.

따라서 melt()는 측정값이 여러 열에 분산되어 있을 때, pivot()는 행 값을 여러 열로 펼치고 싶을 때 선택하세요.

pandas.melt() vs. stack()

두 함수 모두 데이터를 재구성하지만, 다음과 같은 차이가 있습니다.er.

melt()

stack()

일반 열을 행으로 재구성합니다.

하나 이상의 열 레벨을 인덱스로 이동합니다. 

표준 DataFrame을 생성합니다. 

MultiIndex를 갖는 Series 또는 DataFrame을 생성합니다. 

대부분의 분석 작업에서 더 읽기 쉽고 사용하기 쉽습니다.

인덱스 기반 재구성 작업에 더 적합합니다.

계층적 인덱스나 MultiIndex 객체로 작업해야 할 때에는 stack()을 사용할 수 있습니다.

pandas.melt() vs. wide_to_long()

두 함수 모두 와이드 데이터를 롱 포맷으로 변환하지만, 아래와 같이 서로 다른 상황을 위해 설계되었습니다.ut they are designed for different situations, as shown below.

melt()

wide_to_long()

유연하며 거의 모든 DataFrame에서 작동합니다.

일관된 열 명명 패턴을 가진 데이터셋을 위해 설계되었습니다.  

범용 재구성에 적합합니다.  

Sales_2023, Sales_2024, Sales_2025처럼 반복 측정값에 이상적입니다.

데이터셋의 열 이름이 불규칙하다면 melt()를 사용하세요. 열이 예측 가능한 명명 규칙을 따른다면 wide_to_long()을 사용해 더 적은 코드로 재구성할 수 있습니다.

pandas.melt()에서 흔히 하는 실수

pandas.melt()는 사용법이 직관적이지만, 제가 자주 본 함정과 해결 방법은 다음과 같습니다.

  • id_vars를 빠뜨림: id_vars를 지정하지 않으면 pandas는 value_vars에 포함되지 않은 모든 열을 값 열로 간주합니다. 이로 인해 식별자로 남겨야 할 열이 재구성될 수 있습니다. 해결하려면 각 레코드를 고유하게 설명하는 열을 항상 파악하고 id_vars로 전달하세요.

  • 의도하지 않은 열 melt: value_vars를 생략하면 pandas는 id_vars에 포함되지 않은 모든 열을 melt합니다. 여기에는 재구성할 의도가 없는 열이 포함될 수 있습니다. 따라서 일부 열만 melt하려는 경우에는 항상 value_vars를 지정하세요.

  • 출력 형태 오해: melt 후에는 선택한 각 열이 각 레코드에 대해 별도 행이 되므로 행 수가 증가합니다. 예를 들어, 10행과 12개 월 열이 있는 DataFrame은 월 열을 melt하면 120행이 됩니다. 따라서 재구성 전후의 모양을 확인해 데이터가 올바르게 melt되었는지 검증하세요.

  • 와이드/롱 포맷 혼동: 와이드 포맷에서는 유사한 값이 여러 열에 저장됩니다. 롱 포맷에서는 유사한 값이 단일 열에 저장되고, 다른 열이 변수를 식별합니다.

pandas.melt() 사용 모범 사례

재구성 코드를 더 이해하기 쉽고 유지 관리하기 쉽게 만들기 위해, pandas.melt()를 사용할 때 다음 모범 사례를 권장합니다.

  • 먼저 식별자 열을 정하기: 그대로 유지할 열을 결정한 뒤 id_vars로 전달하세요.

  • 생성된 열 이름 바꾸기: 기본 variable, value 대신 var_namevalue_name을 사용하세요.

  • melt 후 행 수 점검: 특히 많은 열을 melt할 때 예상과 일치하는지 확인하세요.

  • 원래 형태로 되돌릴 때는 pivot(): 분석 후 원래 와이드 포맷으로 복원해야 한다면 pivot() 함수를 사용하세요.

Take our Writing Efficient Python Code course to learn 디버그와 유지 보수가 쉬운 효율적인 코드를 작성하는 방법을 배워 보세요.

결론

pandas.melt()는 와이드 포맷 데이터를 롱 포맷으로 변환하는 표준 pandas 함수입니다. id_varsvalue_vars의 역할을 이해하면 어떤 열을 식별자로 남기고 어떤 열을 행으로 변환할지 제어할 수 있습니다.

파이썬을 체계적으로 학습하려면 Python Data FundamentalsPython Programming Fundamentals 스킬 트랙을 참고하세요.

FAQs

pandas.melt()는 언제 사용하나요?

값이 여러 열에 반복되어 있고, 분석이나 시각화를 위해 롱 포맷의 DataFrame이 필요할 때 사용하세요.

var_name과 value_name은 무엇인가요?

이 매개변수는 원래 열 이름과 그에 대응하는 값을 저장하는 생성된 열의 이름을 바꿉니다.

pandas.melt()는 원래 DataFrame을 수정하나요?

아니요. 원본은 변경하지 않고, 재구성된 새 DataFrame을 반환합니다.

melt()와 pivot()의 차이는 무엇인가요?

melt()는 와이드 데이터를 롱 포맷으로 변환하고, pivot()는 롱 데이터를 다시 와이드 포맷으로 변환합니다.

melt()와 stack()의 차이는 무엇인가요?

melt()는 열을 행으로 재구성하면서 일반 DataFrame을 유지합니다. stack()는 열을 인덱스로 이동해 계층적(MultiIndex) 구조를 만듭니다.

주제

DataCamp로 pandas 배우기

courses

pandas로 빠르고 간편한 데이터 적재

4
63.3K
CSV 파일, 스프레드시트, JSON, SQL 데이터베이스, API 등 일반적인 파일 형식과 시스템에서 데이터를 가져오는 방법을 배웁니다.
자세히 보기Right Arrow
강좌 시작
더 보기Right Arrow