pivot, pivot_table 함수의 이해 및 활용하기
학습목표
- pivot, pivot_table 함수의 이해
import numpy as np
import pandas as pd
df = pd.DataFrame({
'지역': ['서울', '서울', '경기', '경기', '부산', '서울', '서울', '부산', '경기', '경기', '경기'],
'요일': ['월요일', '수요일', '월요일', '화요일', '월요일', '목요일', '금요일', '화요일', '수요일', '목요일', '금요일'],
'강수량': [80, 1000, 200, 200, 100, 50, 100, 200, 100, 50, 100],
'강수확률': [70, 90, 10, 20, 30, 50, 90, 20, 80, 50, 10]
})
df
지역 | 요일 | 강수량 | 강수확률 | |
---|---|---|---|---|
0 | 서울 | 월요일 | 80 | 70 |
1 | 서울 | 수요일 | 1000 | 90 |
2 | 경기 | 월요일 | 200 | 10 |
3 | 경기 | 화요일 | 200 | 20 |
4 | 부산 | 월요일 | 100 | 30 |
5 | 서울 | 목요일 | 50 | 50 |
6 | 서울 | 금요일 | 100 | 90 |
7 | 부산 | 화요일 | 200 | 20 |
8 | 경기 | 수요일 | 100 | 80 |
9 | 경기 | 목요일 | 50 | 50 |
10 | 경기 | 금요일 | 100 | 10 |
pivot
- dataframe의 형태를 변경
- 인덱스, 컬럼, 데이터로 사용할 컬럼을 명시
df.pivot('지역', '요일') #index, column
강수량 | 강수확률 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
요일 | 금요일 | 목요일 | 수요일 | 월요일 | 화요일 | 금요일 | 목요일 | 수요일 | 월요일 | 화요일 |
지역 | ||||||||||
경기 | 100.0 | 50.0 | 100.0 | 200.0 | 200.0 | 10.0 | 50.0 | 80.0 | 10.0 | 20.0 |
부산 | NaN | NaN | NaN | 100.0 | 200.0 | NaN | NaN | NaN | 30.0 | 20.0 |
서울 | 100.0 | 50.0 | 1000.0 | 80.0 | NaN | 90.0 | 50.0 | 90.0 | 70.0 | NaN |
df.pivot('요일', '지역')
강수량 | 강수확률 | |||||
---|---|---|---|---|---|---|
지역 | 경기 | 부산 | 서울 | 경기 | 부산 | 서울 |
요일 | ||||||
금요일 | 100.0 | NaN | 100.0 | 10.0 | NaN | 90.0 |
목요일 | 50.0 | NaN | 50.0 | 50.0 | NaN | 50.0 |
수요일 | 100.0 | NaN | 1000.0 | 80.0 | NaN | 90.0 |
월요일 | 200.0 | 100.0 | 80.0 | 10.0 | 30.0 | 70.0 |
화요일 | 200.0 | 200.0 | NaN | 20.0 | 20.0 | NaN |
df.pivot('요일','지역','강수량')
지역 | 경기 | 부산 | 서울 |
---|---|---|---|
요일 | |||
금요일 | 100.0 | NaN | 100.0 |
목요일 | 50.0 | NaN | 50.0 |
수요일 | 100.0 | NaN | 1000.0 |
월요일 | 200.0 | 100.0 | 80.0 |
화요일 | 200.0 | 200.0 | NaN |
pivot_table
- 기능적으로 pivot과 동일
- pivot과의 차이점
- 중복되는 모호한 값이 있을 경우, aggregation 함수 사용하여 값을 채움
- 기능은 groupby랑 거의 똑같고 , 연산을 하는것이 pivot_table이다.
pd.pivot_table(df, index='요일', columns='지역', aggfunc=np.mean)
강수량 | 강수확률 | |||||
---|---|---|---|---|---|---|
지역 | 경기 | 부산 | 서울 | 경기 | 부산 | 서울 |
요일 | ||||||
금요일 | 100.0 | NaN | 100.0 | 10.0 | NaN | 90.0 |
목요일 | 50.0 | NaN | 50.0 | 50.0 | NaN | 50.0 |
수요일 | 100.0 | NaN | 1000.0 | 80.0 | NaN | 90.0 |
월요일 | 200.0 | 100.0 | 80.0 | 10.0 | 30.0 | 70.0 |
화요일 | 200.0 | 200.0 | NaN | 20.0 | 20.0 | NaN |
pd.pivot_table(df, index='요일', columns='지역', aggfunc=np.mean, fill_value=0)
#fill_value=0으로 NaN값을 0으로 대체
강수량 | 강수확률 | |||||
---|---|---|---|---|---|---|
지역 | 경기 | 부산 | 서울 | 경기 | 부산 | 서울 |
요일 | ||||||
금요일 | 100 | 0 | 100 | 10 | 0 | 90 |
목요일 | 50 | 0 | 50 | 50 | 0 | 50 |
수요일 | 100 | 0 | 1000 | 80 | 0 | 90 |
월요일 | 200 | 100 | 80 | 10 | 30 | 70 |
화요일 | 200 | 200 | 0 | 20 | 20 | 0 |