워로디스

Pandas. 데이터 재구조화 pivot 과 pivot_table 본문

Data Science/Pandas

Pandas. 데이터 재구조화 pivot 과 pivot_table

워로디스 2026. 8. 3. 22:23

Pandas 라이브러리에서 데이터프레임의 구조를 변환할 때 사용하는 pivotpivot_table 메서드의 핵심 원리와 차이점, 그리고 올바른 사용 기준을 정리합니다.

1. 피벗(Pivot)의 기본 원리

피벗은 세로로 길게 나열된 데이터(Long format)를 가로로 넓은 교차표 형태(Wide format)로 재구조화하는 작업입니다. 이 과정에서 기존 데이터프레임의 컬럼들은 다음과 같이 3가지 역할로 재배치됩니다.

  • Index (행 인덱스): 지정한 컬럼의 고유 값들이 새로운 데이터프레임의 세로축(행 기준)이 됩니다.
  • Columns (열 헤더): 지정한 컬럼의 고유 값들이 가로로 펼쳐져 새로운 데이터프레임의 가로축(컬럼 이름)이 됩니다.
  • Values (데이터 값): Index와 Columns가 만나는 교차점(Cell)에 들어갈 내용물입니다.

2. pivot과 pivot_table의 핵심 차이점

두 메서드의 가장 큰 차이는 데이터 집계(Aggregation) 기능의 유무입니다.

구분 pivot pivot_table
핵심 목적 단순 형태 변환 (자리 이동) 데이터 그룹화 및 요약/통계
집계 함수 없음 지원 (기본값: 평균 mean)
데이터 중복 허용 불가 (에러 발생) 가능 (집계 함수로 처리)
연산 비용 가벼움 (빠른 속도) 무거움 (그룹화 및 계산 소요)

pivot_table이 더 범용적임에도 pivot이 존재하는 이유는, 데이터의 형태만 바꿀 때 연산 리소스를 아끼고, 원본 데이터에 예기치 않은 중복값이 있는지 조기에 검증(Data Validation)하기 위함입니다.

3. 중복 데이터 처리에 대한 주의사항

pivot에서 에러를 유발하는 '중복'의 의미를 정확히 이해하는 것이 중요합니다.

  • 안전한 중복 (단일 컬럼 내의 중복): 특정 컬럼(예: 지역, 날짜) 안에 동일한 값이 여러 번 등장하는 것은 피벗의 기본 전제이므로 문제가 되지 않습니다.
  • 치명적인 중복 (조합의 중복): pivot이 실패하는 유일한 경우는 indexcolumns로 지정한 두 값의 '조합'이 원본 데이터에 2개 이상 존재할 때입니다. 교차점에 어떤 값을 넣어야 할지 결정할 수 없기 때문입니다.

4. 실전 예제 분석

새로운 예제 데이터(지역별 과일 판매량)를 통해 작동 방식을 비교합니다.

4.1. 정상적으로 pivot이 동작하는 경우

인덱스(Date)와 컬럼(Region)의 조합이 모두 고유한 1:1 대응인 경우입니다.

import pandas as pd
import numpy as np

# 정상 데이터: (Date, Region) 조합이 겹치지 않음
df_valid = pd.DataFrame({
    'Date': ['08-01', '08-01', '08-02', '08-02'],
    'Region': ['Seoul', 'Busan', 'Seoul', 'Busan'],
    'Sales': [100, 150, 120, 180]
})

# 피벗 수행
res_pivot = df_valid.pivot(index='Date', columns='Region', values='Sales')
print(res_pivot)

결과:

Region  Busan  Seoul
Date                
08-01     150    100
08-02     180    120

4.2. pivot 사용 시 에러가 발생하는 경우

동일한 날짜, 동일한 지역에 두 건의 판매 기록이 있는 경우입니다.

# 에러 발생 데이터: 08-01, Seoul 조합이 2번 등장
df_error = pd.DataFrame({
    'Date': ['08-01', '08-01', '08-02'],
    'Region': ['Seoul', 'Seoul', 'Busan'],
    'Sales': [100, 50, 180]
})

# 아래 코드는 ValueError를 발생시킵니다.
# df_error.pivot(index='Date', columns='Region', values='Sales')

4.3. pivot_table을 이용한 중복 데이터 해결

조합이 중복될 경우, pivot_table의 집계 함수(aggfunc)를 사용하여 데이터를 합산(또는 평균 등)하여 처리할 수 있습니다.

# 중복된 08-01, Seoul의 데이터를 합계(sum)로 집계하여 해결
res_table = df_error.pivot_table(
    index='Date', 
    columns='Region', 
    values='Sales', 
    aggfunc='sum',
    fill_value=0 # 빈 칸(NaN)을 0으로 채움
)
print(res_table)

결과: (Seoul의 08-01 데이터가 100과 50을 합친 150으로 계산됨)

Region  Busan  Seoul
Date                
08-01       0    150
08-02     180      0

5. 요약

  • pivot 선택 기준:
  • 데이터의 행/열 조합이 유일함이 보장되어 있고, 집계 없이 구조만 빠르게 변경하거나 데이터 무결성을 검증하고 싶을 때 사용합니다.
  • pivot_table 선택 기준:
  • 데이터에 동일한 행/열 조합이 존재하여 이를 합계, 평균, 개수 등으로 그룹화 및 요약 분석해야 할 때 사용합니다.
반응형