표의 모양 바꾸기: 피봇과 스택 :: Pandas 기초 - mindscale
Skip to content

표의 모양 바꾸기: 피봇과 스택

표의 형태를 다양하게 바꾸는 방법을 알아보겠습니다.

import pandas as pd

titanic_train.csv를 다운받아 엽니다.

df = pd.read_csv('titanic_train.csv')
df.head()
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S

피봇

피봇(pivot)은 데이터프레임에서 2개의 변수를 이용해 데이터들을 그룹지어 통계를 내어 새로운 표를 만드는 방법입니다.

아래는 df에서 Pclass의 값을 기준으로 행을 나누고, Sex의 값을 기준으로 열을 나눠서 Survived의 평균으로 표를 채운 것입니다.

pd.pivot_table(
    df,                 # 원 데이터
    values='Survived',  # 통계낼 변수
    index='Pclass',     # 새로운 표의 행
    columns='Sex')      # 새로운 표의 열
Sex female male
Pclass
1 0.968085 0.368852
2 0.921053 0.157407
3 0.500000 0.135447

pivot_table은 기본적으로 평균을 구합니다만, 아래와 같이 aggfunc를 지정해주면 해당하는 함수를 이용해 통계치를 구합니다. 아래의 예처럼 median으로 지정하면 중간값을 구합니다.

pv = pd.pivot_table(
    df,           
    values='Fare',
    index='Pclass',
    columns='Sex',
    aggfunc='median')

pv
Sex female male
Pclass
1 82.66455 41.2625
2 22.00000 13.0000
3 12.47500 7.9250

스택

stack 메소드는 데이터프레임의 열을 행으로 옮겨줍니다. 아래는 앞에서 만든 피봇 테이블에 stack 메소드를 호출해서 변환한 것입니다.

st = pv.stack()
st
Pclass  Sex   
1       female    82.66455
        male      41.26250
2       female    22.00000
        male      13.00000
3       female    12.47500
        male       7.92500
dtype: float64

스택된 데이터프레임은 멀티 인덱스를 가집니다. 멀티 인덱스의 경우 튜플을 이용해 인덱싱합니다. 다음은 Pclass가 1이고 Sexfemale인 행을 선택하는 방법입니다.

st.loc[(1, 'female')]
82.66454999999999

unstackstack을 반대로 하는 것입니다.

st.unstack()
Sex female male
Pclass
1 82.66455 41.2625
2 22.00000 13.0000
3 12.47500 7.9250