파이썬(Python) 판다스(Pandas) 라이브러리를 활용해 데이터를 다루다 보면 데이터의 목적에 따라 테이블의 구조를 가로형에서 세로형으로, 혹은 세로형에서 가로형으로 변환해야 하는 상황이 자주 발생합니다. 데이터의 가독성을 높이기 위해 요약 표를 만드는 작업이나, 머신러닝 알고리즘이나 데이터 시각화 라이브러리에서 활용하기 적합한 형태로 데이터를 변환하는 전처리 과정이 이에 해당합니다.
판다스에서 데이터프레임의 구조를 유연하게 변경하는 대표적인 기능이 바로 pivot()과 melt() 함수입니다. 이번 글에서는 두 함수의 개념과 구동 방식, 그리고 실무 비즈니스 예시를 바탕으로 구조 변환 과정을 체계적으로 정리해 보겠습니다.
1. 세로형 데이터를 가로형 데이터로 확장하기: pivot() 함수
pivot() 함수는 데이터프레임의 형태를 가로로 넓은 구조(Wide Format)로 재구성하는 도구입니다. 18화에서 배운 pivot_table()과 유사하지만, pivot()은 데이터의 요약이나 집계(Aggregation) 연산을 수행하지 않고 단순히 데이터의 위치만 재배치한다는 점에서 차이가 있습니다. 따라서 index와 columns의 조합이 유일한 데이터셋에서 사용됩니다.
1.1. pivot()의 핵심 파라미터 구조
- index: 변환 후 새로운 데이터프레임의 행 인덱스로 사용할 컬럼명을 지정합니다.
- columns: 변환 후 새로운 데이터프레임의 열(Column)로 펼칠 기준 컬럼명을 지정합니다.
- values: 새로운 테이블의 격자 칸 내부를 채울 데이터 값이 담긴 컬럼명을 지정합니다.
1.2. 비즈니스 예시로 이해하는 pivot 활용
각 지점별로 월마다 기록된 매출 실적 테이블을 가로형 현황판 구조로 변환하는 시나리오를 살펴보겠습니다.
import pandas as pd
# 월별 지점 매출 데이터 생성 (Long Format)
monthly_sales = pd.DataFrame({
'지점': ['서울점', '서울점', '부산점', '부산점', '대구점', '대구점'],
'기준월': ['1월', '2월', '1월', '2월', '1월', '2월'],
'매출액': [4500, 5200, 3100, 3300, 2800, 2900]
})
# pivot 함수를 활용한 가로형 구조 변환
wide_sales = monthly_sales.pivot(index='지점', columns='기준월', values='매출액')
print(wide_sales)
[출력 결과]
기준월 1월 2월
지점
대구점 2800 2900
부산점 3100 3300
서울점 4500 5200
pivot() 연산을 거치면 세로로 길게 나열되어 있던 ‘기준월’의 데이터 항목들이 가로축 열 이름으로 전환됩니다. 중복 데이터가 없는 상태에서 순수하게 데이터 구조를 직관적인 표 형태로 시각화하거나 보고서용 그리드를 만들 때 효율적입니다. 만약 index와 columns의 조합이 중복되면 ValueError가 발생하므로, 이때는 pivot_table()을 사용하여 집계 함수를 명시해 주어야 합니다.
2. 가로형 데이터를 세로형 데이터로 압축하기: melt() 함수
melt() 함수는 pivot()과 정확히 반대 방향으로 작동하는 도구입니다. 가로로 넓게 펼쳐진 데이터프레임(Wide Format)을 세로로 긴 구조(Long Format)로 가공하여, 통계 분석이나 데이터 시각화, 그리고 일부 데이터 처리 작업에 적합한 Long Format으로 변환합니다.
2.1. melt()의 핵심 파라미터 구조
- id_vars: 구조 변환 후에도 세로축 행 인덱스 역할을 유지하며 고정될 컬럼들을 리스트 형태로 지정합니다.
- value_vars: 세로형으로 녹여서 아래로 길게 내릴 대상 열들을 지정합니다. 생략하면
id_vars에 지정되지 않은 모든 컬럼이 대상이 됩니다. - var_name: 원래 가로축 컬럼 이름들이 세로로 내려와서 생성될 새로운 열의 이름을 정의합니다. (기본값은
'variable') - value_name: 각 격자 칸에 들어있던 실제 값들이 모여서 생성될 새로운 열의 이름을 정의합니다. (기본값은
'value')
2.2. 비즈니스 예시로 이해하는 melt 활용
앞서 변환한 가로형 지점 매출 현황판을 다시 통계 분석용 세로형 데이터로 되돌리는 작업을 수행해 보겠습니다.
# 인덱스로 지정되어 있던 '지점'을 일반 컬럼으로 전환
wide_sales_clean = wide_sales.reset_index()
# melt 함수를 활용한 세로형 구조 변환
long_sales = wide_sales_clean.melt(
id_vars='지점',
value_vars=['1월', '2월'],
var_name='해당월',
value_name='실적금액'
)
print(long_sales)
[출력 결과]
지점 해당월 실적금액
0 대구점 1월 2800
1 부산점 1월 3100
2 서울점 1월 4500
3 대구점 2월 2900
4 부산점 2월 3300
5 서울점 2월 5200
melt() 함수를 적용하면 가로로 나뉘어 있던 ‘1월’과 ‘2월’ 컬럼 헤더가 ‘해당월’이라는 하나의 열 내부 데이터로 축소되고, 이에 대응하는 수치들은 ‘실적금액’이라는 하나의 열로 정돈됩니다. 이와 같은 롱 포맷 구조는 데이터 분석가들이 Seaborn이나 Plotly 같은 시각화 라이브러리로 그룹별 그래프를 그리거나 통계적 분석을 수행할 때 주로 활용됩니다.
3. 구조 변환 후 안정적인 후속 전처리 기법
3.1. 인덱스 이름 흔적 제거와 평면화
pivot() 함수를 사용하고 나면 컬럼 축 상단에 원래 기준이 되었던 컬럼명(예: 기준월)의 흔적이 남아있어 데이터프레임이 다소 어색해 보일 수 있습니다. 이를 말끔히 정리하기 위해 아래와 같이 축 속성을 초기화해 주는 편이 좋습니다.
# 컬럼 인덱스에 남아있는 기준 축 이름 제거
wide_sales.columns.name = None
# 좌측 행 인덱스로 묶인 변수를 일반 컬럼으로 원상복구
final_flat_df = wide_sales.reset_index()
3.2. 존재하지 않는 조합의 결측치 제어
가로형 구조로 데이터를 확장하는 과정에서 특정 지점이 특정 월에 영업하지 않아 매칭되는 원본 데이터가 없다면, 판다스는 해당 위치를 NaN(결측치)으로 채우게 됩니다. 변환 이후 안정적인 수학 연산을 이어가려면 fillna()를 이용해 결측치를 처리하거나 필요한 경우 데이터 타입을 변환하여 공백 영역을 사전에 정제하는 방식이 안전합니다.
4. 빅데이터분석기사 실기 시험 환경에서의 실전 활용 포인트
빅데이터분석기사 실기 시험(특히 작업형 제1유형)에서는 데이터의 형태를 다각도로 가공한 뒤 특정 통계치를 산출하는 구조 변환 응용 연산이 출제될 수 있습니다.
4.1. 형태 변환 후 조건부 필터링 연계
예를 들어 “각 상품의 분기별 판매량 현황 데이터셋(가로형)을 세로형으로 변환한 후, 판매량이 3,000개 이상인 데이터들의 분기별 평균을 구하시오”라는 문제가 있다면 다음과 같이 처리할 수 있습니다.
Python
# 1. 가로형 원본 데이터를 melt를 사용해 세로형으로 통합
melted_df = df.melt(id_vars='상품명', var_name='분기', value_name='판매량')
# 2. 불리언 인덱싱으로 조건에 맞는 행만 필터링
filtered_df = melted_df[melted_df['판매량'] >= 3000]
# 3. groupby를 연계하여 분기별 평균 산출
result = filtered_df.groupby('분기')['판매량'].mean()
print(result)
4.2. 머신러닝 데이터 포맷 다듬기
작업형 제2유형에서 시계열 성격의 특징(Feature) 데이터가 여러 열에 걸쳐 넓게 분산되어 제공되는 경우, melt()를 통해 세로형으로 집약한 뒤 통계적 대푯값을 계산하여 단일 피처 열로 축소하는 접근법이 모델의 차원을 줄이고 예측력을 안정적으로 유지하는 데 기여할 수 있습니다. 데이터를 자유자재로 구조화하는 능력은 복잡한 형태의 데이터셋을 주도적으로 제어하는 밑바탕이 됩니다.
5. 요약 및 다음 화 안내
pivot(): 중복 없는 세로형 데이터를 가로형 데이터(Wide Format)로 재배치하여 정보의 가독성을 높입니다.melt(): 가로형 테이블 구조를 세로형 데이터(Long Format)로 압축 변환하여 통계 분석 및 데이터베이스 적재에 최적화된 형태로 다듬어 줍니다.- 구조 정돈: 변환 연산 수행 후에는
reset_index()및 컬럼 레이블 초기화를 적용하여 평면 데이터프레임 구조를 유지하는 편이 다음 전처리에 유리합니다.
다음 [판다스 21화]에서는 누적되는 흐름과 시간적 변화의 추이를 반영하는 고급 계량 연산 기법인 누적합, 이동평균, 순위 계산하기(cumsum, rolling, rank)에 대해 상세하게 알아보겠습니다. 시계열 데이터와 누적 통계 가공 기술을 함께 학습해 봅시다.