Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
Tags
- vim
- PowerShell
- UV
- io
- uv pin
- RandomAccessFile
- Docker Compose
- podman
- Typescript
- Python
- FileChannel
- Ollama
- tauri
- pandas
- vscode
- cli
- Java
- 이미지
- json
- json schema
- docker
- 정렬
- curl
- yaml
- Python Install Manager
- CSS
- 출력 폭
- Vite
- uv init
- Webpack
Archives
- Today
- Total
워로디스
Pandas. 데이터 재구조화 pivot 과 pivot_table 본문
Pandas 라이브러리에서 데이터프레임의 구조를 변환할 때 사용하는 pivot과 pivot_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이 실패하는 유일한 경우는index와columns로 지정한 두 값의 '조합'이 원본 데이터에 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선택 기준:- 데이터에 동일한 행/열 조합이 존재하여 이를 합계, 평균, 개수 등으로 그룹화 및 요약 분석해야 할 때 사용합니다.
반응형
'Data Science > Pandas' 카테고리의 다른 글
| Pandas. 데이터프레임 출력 폭(Width) 조절 방법 (0) | 2026.08.02 |
|---|---|
| Pandas. 연산 함수와 drop 함수의 axis 동작 원리 차이 (0) | 2026.08.02 |
| pandas. IQR을 이용한 이상치 판정 (0) | 2026.06.19 |
