courses
와이드 포맷은 읽기에는 편하지만, 많은 분석 및 시각화 작업은 롱 포맷의 데이터에서 더 잘 작동합니다.
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이면 기존 인덱스를 보존합니다.
위 문법이 데이터를 어떻게 바꾸는지 예제로 보여 드리겠습니다.
아래처럼 각 제품의 월별 매출이 별도 열에 저장된 데이터셋이 있다고 가정해 보겠습니다.

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() 예제
이제 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)

식별자 열 유지하기
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()

출력 열 이름 바꾸기
보시다시피 기본 출력 열 이름은 variable과 value입니다. var_name과 value_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()는 새로운 순차 인덱스를 생성합니다. 원래 행 인덱스를 유지하려면 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)

위 예제에서는 새로운 순차 인덱스로 대체되지 않고, 원래 행 레이블(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()는 행 값을 여러 열로 펼치고 싶을 때 선택하세요.
pandas.melt() vs. stack()
두 함수 모두 데이터를 재구성하지만, 다음과 같은 차이가 있습니다.er.
|
|
|
|
일반 열을 행으로 재구성합니다. |
하나 이상의 열 레벨을 인덱스로 이동합니다. |
|
표준 DataFrame을 생성합니다. |
MultiIndex를 갖는 Series 또는 DataFrame을 생성합니다. |
|
대부분의 분석 작업에서 더 읽기 쉽고 사용하기 쉽습니다. |
인덱스 기반 재구성 작업에 더 적합합니다. |
계층적 인덱스나 MultiIndex 객체로 작업해야 할 때에는 stack()을 사용할 수 있습니다.
pandas.melt() vs. wide_to_long()
두 함수 모두 와이드 데이터를 롱 포맷으로 변환하지만, 아래와 같이 서로 다른 상황을 위해 설계되었습니다.ut they are designed for different situations, as shown below.
|
|
|
|
유연하며 거의 모든 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_name과value_name을 사용하세요. -
melt 후 행 수 점검: 특히 많은 열을 melt할 때 예상과 일치하는지 확인하세요.
-
원래 형태로 되돌릴 때는 pivot(): 분석 후 원래 와이드 포맷으로 복원해야 한다면
pivot()함수를 사용하세요.
Take our Writing Efficient Python Code course to learn 디버그와 유지 보수가 쉬운 효율적인 코드를 작성하는 방법을 배워 보세요.
결론
pandas.melt()는 와이드 포맷 데이터를 롱 포맷으로 변환하는 표준 pandas 함수입니다. id_vars와 value_vars의 역할을 이해하면 어떤 열을 식별자로 남기고 어떤 열을 행으로 변환할지 제어할 수 있습니다.
파이썬을 체계적으로 학습하려면 Python Data Fundamentals 및 Python Programming Fundamentals 스킬 트랙을 참고하세요.
FAQs
pandas.melt()는 언제 사용하나요?
값이 여러 열에 반복되어 있고, 분석이나 시각화를 위해 롱 포맷의 DataFrame이 필요할 때 사용하세요.
var_name과 value_name은 무엇인가요?
이 매개변수는 원래 열 이름과 그에 대응하는 값을 저장하는 생성된 열의 이름을 바꿉니다.
pandas.melt()는 원래 DataFrame을 수정하나요?
아니요. 원본은 변경하지 않고, 재구성된 새 DataFrame을 반환합니다.
melt()와 pivot()의 차이는 무엇인가요?
melt()는 와이드 데이터를 롱 포맷으로 변환하고, pivot()는 롱 데이터를 다시 와이드 포맷으로 변환합니다.
melt()와 stack()의 차이는 무엇인가요?
melt()는 열을 행으로 재구성하면서 일반 DataFrame을 유지합니다. stack()는 열을 인덱스로 이동해 계층적(MultiIndex) 구조를 만듭니다.