표의 모양 바꾸기: 피봇과 스택
표의 형태를 다양하게 바꾸는 방법을 알아보겠습니다.
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이고 Sex
가 female
인 행을 선택하는 방법입니다.
st.loc[(1, 'female')]
82.66454999999999
unstack
은 stack
을 반대로 하는 것입니다.
st.unstack()
Sex | female | male |
---|---|---|
Pclass | ||
1 | 82.66455 | 41.2625 |
2 | 22.00000 | 13.0000 |
3 | 12.47500 | 7.9250 |