23. 데이터프레임의 응용 - 피벗
판다스의 pivot_table() 함수는 엑셀에서 사용하는 피벗테이블과 비슷한 기능을 한다.
- 피벗테이블을 구성하는 4가지 요소
(행 인덱스, 열 인덱스, 데이터 값, 데이터 집계 함수)에 적용할 데이터프레임의 열을 각각 지정하여 함수의 인자로 전달한다.
import pandas as pd
import seaborn as sns
# Ipython 디스플레이 설정 변경
pd.set_option('display.max_columns',10)
pd.set_option('display.max_colwidth',20)
titanic = sns.load_dataset('titanic')
# titanic 데이터셋에서 age,sex 등 5개 열을 설택하여 데이터프레임 만들기
df = titanic.loc[:,['age','sex','class','fare','survived']]
# df기반 pivot_table 만들기
# (행인덱스로 class 열 사용, 열인덱스로 sex열 사용)
# (value로 age값 사용, 집계함수로 mean()-> 평균 사용)
pdf1 = pd.pivot_table(df,
index='class',
columns='sex',
values='age',
aggfunc='mean')
print(pdf1.head())
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
sex female male class First 34.611765 41.281386 Second 28.722973 30.740707 Third 21.750000 26.507589 <class 'pandas.core.frame.DataFrame'>
- 집계함수를 여러개 사용할 수도 있다.
- 여러개 사용하려면 aggfunc 항목에 사용하고자 하는 집계항목을 리스트로 전달한다.
pdf2 = pd.pivot_table(df,index='class',columns='sex',values='survived',aggfunc=['mean','sum'])
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
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
❗ 열 구조는 2중 멀티 인덱스가 된다.
마찬가지로 멀티인덱싱을 하려면 튜플형태로 전달한다.
print(pdf2[ ('mean','female') ])
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
class First 0.968085 Second 0.921053 Third 0.500000
피봇테이블을 만들 때에 행인덱스와 열인덱스 또한 여러개를 지정할 수 있다.
pdf3 = pd.pivot_table(df, index=['class','sex'],
columns='survived',
values=['age','fare'],
aggfunc=['mean','max'])
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
mean max \ age fare age survived 0 1 0 1 0 1 class sex First female 25.666667 34.939024 110.604167 105.978159 50.0 63.0 male 44.581967 36.248000 62.894910 74.637320 71.0 80.0 Second female 36.000000 28.080882 18.250000 22.288989 57.0 55.0 male 33.369048 16.022000 19.488965 21.095100 70.0 62.0 Third female 23.818182 19.329787 19.773093 12.464526 48.0 63.0
fare survived 0 1 class sex First female 151.55 512.3292 male 263.00 512.3292 Second female 26.00 65.0000 male 73.50 39.0000
print(pdf3.index)
print(pdf3.columns)
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
MultiIndex([( 'First', 'female'), ( 'First', 'male'), ('Second', 'female'), ('Second', 'male'), ( 'Third', 'female'), ( 'Third', 'male')], names=['class', 'sex']) MultiIndex([('mean', 'age', 0), ('mean', 'age', 1), ('mean', 'fare', 0), ('mean', 'fare', 1), ( 'max', 'age', 0), ( 'max', 'age', 1), ( 'max', 'fare', 0), ( 'max', 'fare', 1)], names=[None, None, 'survived'])
❗ pdf3의 행을 선택하기 위해 xs인덱서를 사용해보자.
# xs 인덱서 사용 - default: axis=0
print(pdf3.xs('First',level='class'))
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
mean max \ age fare age fare survived 0 1 0 1 0 1 0 sex female 25.666667 34.939024 110.604167 105.978159 50.0 63.0 151.55 male 44.581967 36.248000 62.894910 74.637320 71.0 80.0 263.00
survived 1 sex female 512.3292 male 512.3292
# xs 인덱서 사용 - 멀티인덱싱처럼 레벨 순서대로 튜플형태로 전달
print(pdf3.xs( ('First', 'female') ) )
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
survived mean age 0 25.666667 1 34.939024 fare 0 110.604167 1 105.978159 max age 0 50.000000 1 63.000000 fare 0 151.550000 1 512.329200
# xs 인덱서 사용 - 행인덱스 레벨을 직접 지정하는 방법
print(pdf3.xs('male',level='sex')
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
mean max age fare age fare survived 0 1 0 1 0 1 0 class First 44.581967 36.248000 62.894910 74.637320 71.0 80.0 263.00 Second 33.369048 16.022000 19.488965 21.095100 70.0 62.0 73.50 Third 27.255814 22.274211 12.204469 15.579696 74.0 45.0 69.55
survived 1 class First 512.3292 Second 39.0000 Third 56.4958
# xs인덱서 사용 - 여러개의 행인덱스를 선택할때 레벨을 지정하는 방식
print(pdf3.xs( ('Second','male'), level=([0,'sex']))
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
mean max age fare age fare survived 0 1 0 1 0 1 0 1 class sex Second male 33.369048 16.022 19.488965 21.0951 70.0 62.0 73.5 39.0
❗ xs 인덱서를 사용하여 열 인덱스에 접근하기 (axis=1 사용, (default axis = 0)
print(pdf3.xs('mean',axis=1))
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
age fare survived 0 1 0 1 class sex First female 25.666667 34.939024 110.604167 105.978159 male 44.581967 36.248000 62.894910 74.637320 Second female 36.000000 28.080882 18.250000 22.288989 male 33.369048 16.022000 19.488965 21.095100 Third female 23.818182 19.329787 19.773093 12.464526 male 27.255814 22.274211 12.204469 15.579696
# survived 레벨이 1인 데이터 선택
print(pdf3.xs(1,level='survived',axis=1))
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
mean max age fare age fare class sex First female 34.939024 105.978159 63.0 512.3292 male 36.248000 74.637320 80.0 512.3292 Second female 28.080882 22.288989 55.0 65.0000 male 16.022000 21.095100 62.0 39.0000 Third female 19.329787 12.464526 63.0 31.3875 male 22.274211 15.579696 45.0 56.4958
# max,fare, survived=0 인 데이터 선택
print(pdf3.xs(('max','fare',0), level = [0,1,2], axis=1))
🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽🔽
max fare survived 0 class sex First female 151.55 male 263.00 Second female 26.00 male 73.50 Third female 69.55 male 69.55
Author And Source
이 문제에 관하여(23. 데이터프레임의 응용 - 피벗), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kdo6301/23.-데이터프레임의-응용-피벗저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)