pivot_table() : 피벗 테이블

판다스 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개가 만들어진다.

xs로 접근