logo

[pandas-basic] 표의 모양 바꾸기: 피봇과 스택

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

import pandas as pd

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

df = pd.read_csv('titanic_train.csv')
df.head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
 

피봇

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

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

pd.pivot_table(
    df,                 # 원 데이터
    values='Survived',  # 통계낼 변수
    index='Pclass',     # 새로운 표의 행
    columns='Sex')      # 새로운 표의 열
Sexfemalemale
Pclass
10.9680850.368852
20.9210530.157407
30.5000000.135447

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

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

pv
Sexfemalemale
Pclass
182.6645541.2625
222.0000013.0000
312.475007.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()
Sexfemalemale
Pclass
182.6645541.2625
222.0000013.0000
312.475007.9250
Previous
같은 값을 가지는 행들끼리 이어붙이기