Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python pandas로 데이터프레임 구조 바꾸기: melt(), stack(), unstack(), pivot() 활용법

데이터 분석을 하다 보면 데이터프레임(DataFrame)의 구조를 목적에 맞게 변형해야 하는 경우가 자주 발생합니다. pandas에서는 melt(), stack(), unstack(), pivot() 함수를 사용하여 넓은 형태(wide format)의 데이터프레임을 긴 형태(long format)로 변환하거나, 그 반대로 재구성할 수 있습니다.

아래에서 각 함수별 해결 방법을 예제 코드와 함께 살펴보겠습니다. 모든 예제는 다음과 같은 기본 데이터프레임을 사용합니다.

import pandas as pd
df = pd.DataFrame({'Id':[1,2,3],'Age':[13,14,13],'Mark':[80,90,85]})
print("Dataframe is:\n",df)

방법 1: melt() 함수로 열을 행으로 변환하기

melt() 함수는 넓은 형태의 데이터프레임에서 하나 이상의 열을 식별자 변수(id_vars)와 값(value)의 쌍으로 변환하여, 행 중심의 긴 형태로 만들어 줍니다. 시각화 라이브러리(seaborn 등)나 집계 연산에 데이터를 넘기기 전에 유용하게 사용됩니다.

사용 문법

df.melt()

예제 코드

import pandas as pd
df = pd.DataFrame({'Id':[1,2,3],'Age':[13,14,13],'Mark':[80,90,85]})
print("Dataframe is:\n",df)
print(df.melt())

실행 결과

Dataframe is:
Id Age Mark
0 1 13 80
1 2 14 90
2 3 13 85
variable value
0 Id 1
1 Id 2
2 Id 3
3 Age 13
4 Age 14
5 Age 13
6 Mark 80
7 Mark 90
8 Mark 85

출력 결과를 보면 기존의 'Id', 'Age', 'Mark' 열들이 'variable'과 'value'라는 두 개의 열로 정렬되어 세로로 길게 재구성된 것을 확인할 수 있습니다.

방법 2: stack()과 unstack()으로 인덱스 레벨 조작하기

stack() 함수는 데이터프레임의 열(column)들을 가장 안쪽 인덱스 레벨로 내려서, 멀티인덱스(MultiIndex)를 가진 Series를 반환합니다. 반대로 unstack()은 인덱스의 레벨을 열로 올려 원래 상태로 되돌릴 때 사용합니다.

사용 문법

df.stack().to_frame()
# 원래대로 되돌리기
df.unstack().to_frame()

예제 코드

import pandas as pd
df = pd.DataFrame({'Id':[1,2,3],'Age':[13,14,13],'Mark':[80,90,85]})
print("Dataframe is:\n",df)
print(df.stack().to_frame())
print(df.unstack().to_frame())

실행 결과

Dataframe is:
Id Age Mark
0 1 13 80
1 2 14 90
2 3 13 85
0
0 Id 1
Age 13
Mark 80
1 Id 2
Age 14
Mark 90
2 Id 3
Age 13
Mark 85
0
Id 0 1
1 2
2 3
Age 0 13
1 14
2 13
Mark 0 80
1 90
2 85

stack()을 적용하면 행 인덱스와 열 이름이 결합된 멀티인덱스 구조가 만들어지고, unstack()을 적용하면 열 이름이 인덱스 레벨로 올라가며 원본 데이터가 복원됩니다.

방법 3: pivot() 함수로 지정한 열 기준 재구성하기

pivot() 함수는 특정 열의 고유한 값을 새로운 열의 헤더(컬럼명)로 사용하여 데이터프레임을 재구성합니다. 아래 예제에서는 'Id' 열의 값을 기준으로 데이터프레임을 피벗(pivot)합니다.

사용 문법

df.pivot(columns='Id')

예제 코드

import pandas as pd
df = pd.DataFrame({'Id':[1,2,3],'Age':[13,14,13],'Mark':[80,90,85]})
print("Dataframe is:\n",df)
print(df.pivot(columns='Id'))

실행 결과

Dataframe is:
Id Age Mark
0 1 13 80
1 2 14 90
2 3 13 85
Age Mark
Id 1 2 3 1 2 3
0 13.0 NaN NaN 80.0 NaN NaN
1 NaN 14.0 NaN NaN 90.0 NaN
2 NaN NaN 13.0 NaN NaN 85.0

pivot() 결과에서 해당 위치에 값이 존재하지 않으면 NaN(Not a Number)이 채워지는 점에 유의하세요. pivot_table() 함수를 사용하면 중복 값 처리와 함께 집계까지 한 번에 수행할 수 있습니다.

정리

  • melt(): 넓은 형태(wide) → 긴 형태(long) 변환에 적합
  • stack() / unstack(): 열과 인덱스 레벨을 서로 전환하여 멀티인덱스 구조를 다룰 때 유용
  • pivot(): 특정 열의 값을 기준으로 표의 축을 재배치할 때 사용

상황에 맞는 함수를 선택하면 데이터 전처리 과정을 훨씬 효율적으로 수행할 수 있습니다.