Data Analysis

피벗과 피벗테이블

김심슨 2025. 5. 27. 20:06

행/열 구조를 바꿔서 요약된 표 만들기 

 

0. 기본 개념 

import pandas as pd

df = pd.DataFrame({
    'name': ['홍길동', '홍길동', '강감찬', '강감찬'],
    'subject': ['국어', '수학', '국어', '수학'],
    'score': [90, 80, 70, 85]
})

 

1. 기본 개념을 피벗으로 변환 

df.pivot(index='name', colmuns='subject', values='score')

index : 행에 올 값 

columns : 열로 나눌 값 

values : 셀 안에 채울 값 

 

+) 주의 : pivot()은 중복 안 됨 

동일한 (name, subject) 조합이 두 번 이상 있으면 에러 남 -> pivot_table() 사용하기 

=> index, columns의 조합이 유일해야 한다. 

< 해결 방법 2가지 >

1. pivot_table() 사용 (중복 자동 처리)

df.pivot_table(index='name', columns='subject', values='score', aggfunc='mean')

-> pivot_table()은 중복되면 mean, sum 등으로 자동 집계 가능 (실무에서는 이걸 씀)

 

2. 중복 제거 후 pivot()사용 (.drop_duplicates)

 

- 중복 조합을 사전에 확인 (.duplicated) : 몇 건 있는지 확인해서, 애초에 pivot()을 쓸 수 있는 상태인지 점검 가능 

df.duplicated(subset=['name','subject']).sum()
df.drop_duplicates(subset=['name', 'subject'], keep='first') \
	.pivot(index='name', columns='subject', values='score')

- keep = 'first' -> 첫 번째 것만 남긴다. 

 

+ ) pivot_table은 다중인덱스도 가능 

df_sales.pivot_table(index=['store'], columns=['month'], values='sales', aggfunc='sum',fill_value = 0)

-> fill_value = 0 : NaN을 0으로 대체