Pivot Table (피벗 테이블)
- 데이터를 요약하거나 재구조화 할때 유용하게 사용
- 엑셀의 피벗테이블 과 유사
- 데이터프레임을 특정 열을 기준으로 요약하고 집계 가능
기본 구조
- pivot_table() 함수를 사용
- 아래와 같은 매개변수 제공
pd.pivot_table(
data, # 데이터프레임
values=None, # 집계할 값
index=None, # 행 기준으로 사용할 열
columns=None, # 열 기준으로 사용할 열
aggfunc='mean',# 집계 함수 (기본값: 평균)
fill_value=None, # NaN 대체값
margins=False # 행과 열의 합계 표시 여부
)
예시 데이터
import pandas as pd
data = {
'Region': ['North', 'South', 'East', 'West', 'North', 'South', 'East', 'West'],
'Product': ['A', 'A', 'B', 'B', 'A', 'B', 'B', 'A'],
'Sales': [100, 150, 200, 300, 400, 350, 250, 100]
}
df = pd.DataFrame(data)
print(df)
# 출력
Region Product Sales
0 North A 100
1 South A 150
2 East B 200
3 West B 300
4 North A 400
5 South B 350
6 East B 250
7 West A 100
(1) 기본 피벗테이블 생성
# Region을 행으로, Sales를 값으로 요약
pivot = pd.pivot_table(df, index='Region', values='Sales', aggfunc='sum')
print(pivot)
# 출력
Sales
Region
East 450
North 500
South 500
West 400
- Region 을 기준으로 그룹화하고, Sales 값을 합계( sum ) 로 집계
(2) columns 지정
# Region을 행으로, Product를 열로 설정
pivot = pd.pivot_table(df, index='Region', columns='Product', values='Sales', aggfunc='sum')
print(pivot)
# 출력
Product A B
Region
East NaN 450.0
North 500.0 NaN
South 150.0 350.0
West 100.0 300.0
- Region 을 행으로, Product 를 열로, Sales 를 값으로 설정
- 결측값( NaN )은 해당 조합에 데이터가 없음
(3) fill_value 로 결측값 대체
# NaN 값을 0으로 대체
pivot = pd.pivot_table(df, index='Region', columns='Product', values='Sales', aggfunc='sum', fill_value=0)
print(pivot)
# 출력
Product A B
Region
East 0 450
North 500 0
South 150 350
West 100 300
- fill_value=0 을 사용해 결측값을 0 으로 대체
(4) 여러 집계 함수 적용
# 여러 집계 함수 적용
pivot = pd.pivot_table(df, index='Region', values='Sales', aggfunc=['sum', 'mean', 'count'])
print(pivot)
# 출력
sum mean count
Region
East 450 225.0 2
North 500 250.0 2
South 500 250.0 2
West 400 200.0 2
- aggfunc 에 리스트를 전달해 합계( sum ), 평균( mean ), 개수( count )를 동시에 계산
(5) margins=True 로 총합 계산
pivot = pd.pivot_table(df, index='Region', columns='Product', values='Sales', aggfunc='sum', margins=True, fill_value=0)
print(pivot)
# 출력
Product A B All
Region
East 0 450 450
North 500 0 500
South 150 350 500
West 100 300 400
All 750 1100 1850
(6) 다중 index 와 columns 지정
# Region, Product를 행, 열로 설정
pivot = pd.pivot_table(df, index=['Region', 'Product'], values='Sales', aggfunc='sum')
print(pivot)
# 출력
Sales
Region Product
East B 450
North A 500
South A 150
B 350
West A 100
B 300