판다스 pivot_table() 함수는 엑셀(excel)에서 사용하는 피벗테이블과 비슷한 기능을 처리한다.
피벗테이블을 구성하는 4가지 요소
에 적용할 DF의 열을 각각 지정하여 함수의 인자로 전달한다.
import pandas as pd
import seaborn as sns
titanic = sns.load_dataset('titanic')
df = titanic.loc[:, ['age', 'sex', 'class', 'fare', 'survived']]
print(df.head())
print("--------------------------")
# pivot table 만들기
# class와 sex에 따른 age의 평균을 구한다.
pdf1 = pd.pivot_table(df,
index='class',
columns='sex',
values='age',
aggfunc='mean')
print(pdf1.head())
print("-------------------------")
# 집계 함수를 2개이상 지정할 수 있다.
# mean, sum을 통해 생존율과 생존자 수를 집계한다.
pdf2 = pd.pivot_table(df,
index='class',
columns='sex',
values='survived',
aggfunc=['mean', 'sum'])
print(pdf2.head())
age sex class fare survived
0 22.0 male Third 7.2500 0
1 38.0 female First 71.2833 1
2 26.0 female Third 7.9250 1
3 35.0 female First 53.1000 1
4 35.0 male Third 8.0500 0
--------------------------
sex female male
class
First 34.611765 41.281386
Second 28.722973 30.740707
Third 21.750000 26.507589
-------------------------
mean sum
sex female male female male
class
First 0.968085 0.368852 91 45
Second 0.921053 0.157407 70 17
Third 0.500000 0.135447 72 47
MultiIndex를 넣어보자.
import pandas as pd
import seaborn as sns
pd.set_option('display.max_columns', 8)
titanic = sns.load_dataset('titanic')
df = titanic.loc[:, ['age', 'sex', 'class', 'fare', 'survived']]
print(df.head())
print("--------------------------------------")
pdf3 = pd.pivot_table(df,
index=['class', 'sex'],
columns='survived',
values=['age', 'fare'],
aggfunc=['mean', 'sum']
)
print(pdf3.head())
print("--------------------------------------")
print("index :")
print(pdf3.index)
print("--------------------------------------")
print("columns : ")
print(pdf3.columns)
"
age sex class fare survived
0 22.0 male Third 7.2500 0
1 38.0 female First 71.2833 1
2 26.0 female Third 7.9250 1
3 35.0 female First 53.1000 1
4 35.0 male Third 8.0500 0
--------------------------------------
mean
sum \\
age fare
age
survived 0 1 0
1 0 1
class sex
First female 25.666667 34.939024 110.604167 105.978159 77.0 2865.00
male 44.581967 36.248000 62.894910 74.637320 2719.5 1449.92
Second female 36.000000 28.080882 18.250000 22.288989 216.0 1909.50
male 33.369048 16.022000 19.488965 21.095100 2803.0 240.33
Third female 23.818182 19.329787 19.773093 12.464526 1310.0 908.50
fare
survived 0 1
class sex
First female 331.8125 9644.0125
male 4842.9081 3358.6794
Second female 109.5000 1560.2292
male 1773.4958 358.6167
Third female 1423.6627 897.4459
--------------------------------------
index :
MultiIndex([( 'First', 'female'),
( 'First', 'male'),
('Second', 'female'),
('Second', 'male'),
( 'Third', 'female'),
( 'Third', 'male')],
names=['class', 'sex'])
--------------------------------------
columns :
MultiIndex([('mean', 'age', 0),
('mean', 'age', 1),
('mean', 'fare', 0),
('mean', 'fare', 1),
( 'sum', 'age', 0),
( 'sum', 'age', 1),
( 'sum', 'fare', 0),
( 'sum', 'fare', 1)],
names=[None, None, 'survived'])
index를 class, sex로 지정했기 때문에 index가 multiIndex로 적용되어 2*3개가 나온다.
columns를 보자. survived에 따른 age, fare에 대하여 mean과 sum을 구하므로 columns도 222개가 만들어진다.