간단한 버전
- 피벗테이블의 값, 행, 열 / 집계방식 / 결측치처리여부 / 정렬여부
import pandas as pd
df.pivot_table(values='col*', index='col$', columns='col#', aggfunc=<'mean'|'median'|'count'|'nunique'..>, dropna=<True|False>, sort=<True|False>)
공식 문서 기준
- 외에도 더 다양한 매개변수들을 pivot_table의 파라미터로 사용 가능하다.
DataFrame.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=<no_default>, sort=True)
pivot_table 샘플 데이터 조작 예시
### 샘플 데이터 ###
df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
"bar", "bar", "bar", "bar"],
"B": ["one", "one", "one", "two", "two",
"one", "one", "two", "two"],
"C": ["small", "large", "large", "small",
"small", "large", "small", "small",
"large"],
"D": [1, 2, 2, 3, 3, 4, 5, 6, 7],
"E": [2, 4, 5, 5, 6, 6, 8, 9, 9]})
table = pd.pivot_table(df, value='D', index=['A','B'], columns=['C'], aggfunc='sum')
table
### 출력 ###
# C large small
# A B
# bar one 4.0 5.0
# two 7.0 6.0
# foo one 4.0 1.0
# two NaN 6.0
집계함수 (aggfunc) 를 값 별로 다르게 적용할 수도 있다.
table = pd.pivot_table(df, values=['D', 'E'], index=['A', 'C'],
aggfunc={'D': "mean",
'E': ["min", "max", "mean"]})
table
### 출력 ###
# D E
# mean max mean min
# A C
# bar large 5.500000 9 7.500000 6
# small 5.500000 9 8.500000 8
# foo large 2.000000 5 4.500000 4
# small 2.333333 6 4.333333 2
pivot_table을 직접 작성하려고 하다보면, 생각하는 흐름에 따라서 두 가지 방향으로 작성하게 되는 것 같다.
Case 1. pivot_table( )의 괄호 안에 df 를 쓰는 경우
: pd.pivot_table을 작성한 후 → 괄호 안에 데이터인 df를 작성함.
Case 2. pivot_table( )의 괄호 안에 df 를 쓰지 않는 경우
: 데이터인 df를 먼저 불러와서, df.pivot_table 을 쓰는 경우
결론은..! 두 케이스 모두 정상적으로 동작했다.
지금은 다른 pandas 기능을 쓸 때처럼 ' pd.~ ' 으로 시작하는 게 손에 익숙하기 때문에 첫번째 케이스로 주로 작성하고 있다.
# Case 1.
# pd.pivot_table로 쓰고, 사용할 데이터는 괄호 안에서 df 로 불러옴.
table = pd.pivot_table(df, value='D', index=['A','B'], columns=['C'], aggfunc='sum')
table
# Case 2.
# df.pivot_table로 써서 사용할 데이터를 앞에서 df. 으로 불러옴.
table = df.pivot_table(value='D', index=['A','B'], columns=['C'], aggfunc='sum')
table