표의 모양 바꾸기: 피봇과 스택
표의 형태를 다양하게 바꾸는 방법을 알아보겠습니다.
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 |