Pandas & NumPy Academy · 강의

melt: 넓은 형식에서 긴 형식으로

pd.melt로 넓은 형식의 DataFrame을 긴 형식으로 변환하고 id_vars와 value_vars를 지정합니다.

레슨 2/413개 단계

melt: 넓은 형식에서 긴 형식으로은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

넓은 형식과 긴 형식의 데이터

데이터는 기본적으로 두 가지 형태로 구성할 수 있습니다. 넓은 형식은 대상마다 한 행을 사용하고 여러 열에 측정값을 펼칩니다. 예를 들어 1월, 2월, 3월 매출을 각각 별도의 열에 저장하는 방식입니다. 긴 형식은 관측값마다 한 행을 사용하며, 변수 이름을 위한 열과 값을 위한 열을 둡니다. 대부분의 Pandas 분석 함수, 기계 학습 라이브러리 및 시각화 도구는 긴 형식을 선호하므로 melt()는 필수적인 변환 도구입니다.

pd.melt() 함수

pd.melt(df)(df.melt()으로도 사용 가능)는 넓은 형식의 DataFrame을 긴 형식으로 변환합니다. 핵심 매개변수는 다음과 같습니다. id_vars(식별자로 유지할 열이며 변경되지 않음), value_vars(행으로 펼칠 열), var_name(새 변수 열의 이름), value_name(새 값 열의 이름)입니다.

import pandas as pd

# Wide format: separate columns per month
df_wide = pd.DataFrame({
    'product': ['A', 'B'],
    'Jan':     [100, 150],
    'Feb':     [120, 130],
    'Mar':     [140, 160]
})

print(df_wide)
#   product  Jan  Feb  Mar
# 0       A  100  120  140
# 1       B  150  130  160

기본 melt() 호출

식별자로 유지하려는 열을 id_vars에 지정하여 melt()를 호출하십시오. 나머지 모든 열은 펼쳐집니다. 열 이름은 새 변수 열의 값이 되고, 각 셀의 값은 값 열로 이동합니다. 출력 행 수는 입력 행 수에 펼치는 값 열의 수를 곱한 것과 같습니다.

df_long = df_wide.melt(
    id_vars='product',
    var_name='month',
    value_name='sales'
)
print(df_long)
#   product month  sales
# 0       A   Jan    100
# 1       B   Jan    150
# 2       A   Feb    120
# 3       B   Feb    130
# 4       A   Mar    140
# 5       B   Mar    160

melt할 열 선택하기

기본적으로 id_vars에 나열되지 않은 모든 열이 melt됩니다. value_vars를 사용하면 일부 열만 melt할 수 있습니다. id_vars나 value_vars에 포함되지 않은 열은 결과에서 삭제됩니다. 넓은 형식의 DataFrame에 시계열 열과 펼치고 싶지 않은 다른 속성이 함께 있을 때 유용합니다.

df_wide2 = pd.DataFrame({
    'product': ['A', 'B'],
    'category': ['Electronics', 'Clothing'],
    'Jan': [100, 150],
    'Feb': [120, 130],
    'Mar': [140, 160]
})

# Melt only Jan and Feb, keep product and category
df_long2 = df_wide2.melt(
    id_vars=['product', 'category'],
    value_vars=['Jan', 'Feb'],
    var_name='month',
    value_name='sales'
)
print(df_long2)

melt() 후 인덱스 재설정하기

melt()는 각 변수마다 원래 행 인덱스를 반복하여 원래 인덱스를 유지합니다. 따라서 결과에 [0, 1, 0, 1, 0, 1]과 같은 비연속 인덱스가 생기는 경우가 많습니다. melt() 직후 reset_index(drop=True)를 호출해 출력 인덱스를 0부터 n-1까지의 깔끔한 연속 인덱스로 만드는 것이 좋습니다.

df_long = df_wide.melt(id_vars='product', var_name='month', value_name='sales')
print('Before reset:', df_long.index.tolist())
# [0, 1, 0, 1, 0, 1]

df_long = df_long.reset_index(drop=True)
print('After reset:', df_long.index.tolist())
# [0, 1, 2, 3, 4, 5]

melt()는 pivot()의 역연산입니다

melt()는 개념적으로 pivot() / pivot_table()의 반대 작업입니다. pivot_table()을 사용하면 긴 형식에서 넓은 형식으로, melt()를 사용하면 넓은 형식에서 다시 긴 형식으로 변환할 수 있습니다. 이러한 왕복 변환은 파이프라인에서 자주 사용됩니다. 넓은 형식으로 받은 데이터를 시본 시각화나 기계 학습 특성에 사용하기 위해 긴 형식으로 바꾼 다음, 필요하면 보고서용 표를 만들기 위해 다시 피벗하는 방식입니다.

# long -> wide
table = df_long.pivot_table(values='sales', index='product',
                            columns='month', aggfunc='sum')
print(table)
# product  Feb  Jan  Mar
# A        120  100  140
# B        130  150  160

# wide -> long again
long_again = table.reset_index().melt(id_vars='product', var_name='month', value_name='sales')
print(long_again.head())

Seaborn 시각화에 melt() 사용하기

Seaborn의 범주형 플롯과 관계형 플롯은 긴 형식의 데이터에서 가장 잘 작동합니다. 일반적인 작업 흐름은 다음과 같습니다. 먼저 그룹마다 열이 하나씩 있는 넓은 형식의 DataFrame으로 시작하고, 한 열에는 그룹을 식별하는 값이, 다른 열에는 값이 들어가도록 melt하여 긴 형식으로 변환합니다. 그런 다음 두 열을 Seaborn의 hue 및 x/y 매개변수에 전달합니다. 이것이 melt()를 사용하는 가장 일반적인 이유 중 하나입니다.

import seaborn as sns
import matplotlib.pyplot as plt

# Long format is required for sns.lineplot with hue
df_long = df_wide.melt(id_vars='product', var_name='month', value_name='sales')

# sns.lineplot(data=df_long, x='month', y='sales', hue='product')
# plt.show()
print('Long data ready for Seaborn:')
print(df_long)

출력 열 이름 지정

기본적으로 melt()는 새 변수 열의 이름을 'variable'로, 값 열의 이름을 'value'로 지정합니다. 항상 var_name과 value_name을 사용하여 의미 있는 이름으로 재정의하십시오. 설명적인 열 이름을 사용하면 이후 코드가 읽기 쉬워지고, DataFrame에 열이 수십 개 있을 때 혼동을 방지할 수 있습니다.

# Default: generic column names 'variable' and 'value'
default = df_wide.melt(id_vars='product')
print(default.columns.tolist())
# ['product', 'variable', 'value']

# Better: descriptive names
good = df_wide.melt(id_vars='product', var_name='month', value_name='revenue_usd')
print(good.columns.tolist())
# ['product', 'month', 'revenue_usd']

설문 데이터 변환하기

melt()의 전형적인 사용 사례는 각 열이 질문이고 각 행이 응답자인 설문 응답 데이터입니다. melt하면 넓은 형식이 응답자 ID, 질문 이름, 답변 값 열을 포함하는 긴 형식으로 변환됩니다. 그런 다음 groupby()를 사용하여 질문별 답변 분포를 쉽게 계산할 수 있습니다.

survey = pd.DataFrame({
    'respondent': [1, 2, 3],
    'Q1_rating': [5, 3, 4],
    'Q2_rating': [4, 5, 3],
    'Q3_rating': [2, 4, 5]
})

long = survey.melt(id_vars='respondent', var_name='question', value_name='rating')
print(long)
print(long.groupby('question')['rating'].mean())

변환된 결과 정렬하기

melt한 후에는 각 행에 대해 원래 열 순서(1월, 2월, 3월)로 행이 정렬됩니다. 식별자 열을 먼저 정렬한 다음 변수 열을 정렬해야 하는 경우가 많습니다. 변환된 DataFrame에 sort_values()를 사용하면 분석이나 이후 처리에 가장 적합한 순서로 정렬할 수 있습니다.

df_long = df_wide.melt(id_vars='product', var_name='month', value_name='sales')

# Sort by product, then month
df_sorted = df_long.sort_values(['product', 'month']).reset_index(drop=True)
print(df_sorted)
#   product month  sales
# 0       A   Feb    120
# 1       A   Jan    100
# 2       A   Mar    140
# 3       B   Feb    130
# 4       B   Jan    150
# 5       B   Mar    160

데이터 파이프라인에서 melt() 사용하기

일반적인 데이터 파이프라인에서는 넓은 형식의 데이터를 불러오거나 정리한 직후, 분석이나 모델링 단계 전에 melt()가 사용됩니다. 파이프라인 초기에 배치하여 빠르게 긴 형식으로 변환하면, 이후의 모든 작업(groupby, 시본, 사이킷런)이 별도의 예외 처리 없이 정리된 긴 형식 데이터에서 작동합니다.

def load_and_reshape(filepath):
    raw = pd.read_csv(filepath)
    # Melt all month columns into long format
    month_cols = [c for c in raw.columns if c.startswith('month_')]
    long = raw.melt(
        id_vars=[c for c in raw.columns if c not in month_cols],
        value_vars=month_cols,
        var_name='month',
        value_name='value'
    )
    return long.reset_index(drop=True)

빠른 확인

이 수업에서 배운 pd.melt의 넓은 형식에서 긴 형식으로의 변환에 대한 이해도를 확인해 보십시오.

수업 요약

이 수업에서는 다음을 배웠습니다. melt()는 열을 행으로 변환하여 넓은 형식을 긴 형식으로 바꿉니다. id_vars는 고정된 상태로 유지할 열을 지정하고, value_vars는 melt할 열을 선택합니다. var_name과 value_name은 새 열에 설명적인 이름을 부여합니다. 또한 긴 형식은 Seaborn, groupby, 머신러닝 파이프라인에 적합합니다. 다음으로는 MultiIndex DataFrames의 형태를 바꾸는 stack과 unstack을 살펴보겠습니다.

무료로 시작

AI 튜터와 함께 Python을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
30
레슨
120

자주 묻는 질문

“melt: 넓은 형식에서 긴 형식으로” 강의는 무료인가요?

네 — “melt: 넓은 형식에서 긴 형식으로” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“melt: 넓은 형식에서 긴 형식으로”에서 뭘 배우나요?

pd.melt로 넓은 형식의 DataFrame을 긴 형식으로 변환하고 id_vars와 value_vars를 지정합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“melt: 넓은 형식에서 긴 형식으로” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. pivot_table: 교차 집계
  2. melt: 넓은 형식에서 긴 형식으로
  3. MultiIndex에서 stack과 unstack 사용하기
  4. 빈도표에 crosstab 사용하기
← Pandas & NumPy Academy(으)로 돌아가기