조금씩 꾸준히 완성을 향해

[Pandas] 피벗 테이블(Pivot Table) & 멀티 인덱스(MultiIndex) 본문

Python/Numpy & Pandas

[Pandas] 피벗 테이블(Pivot Table) & 멀티 인덱스(MultiIndex)

all_sound 2022. 10. 10. 23:30

피벗 테이블


  • 판다스 pivot_table() 사용
  • pivot_table() 함수의 기본 구성요소 : 행인덱스, 열인덱스, 데이터값, 데이터집계함수
 # 데이터 확인
 df = sns.load_dataset('titanic')
 df.head()

# 데이터 프레임 -> 피벗 테이블
pd.pivot_table(df,             # 피벗할 데이터 프레임
               values='age',   # 데이터로 사용할 들어갈 열 
               index='class',  # 행 위치에 들어갈 열
               columns='sex',  # 열 위치에 들어갈 열
               aggfunc='mean') # 데이터 집계 함수

pd.pivot_table(data=df,                 # 피벗할 데이터 프레임
               values='survived',       # 데이터로 사용할 열
               index='class',           # 행 위치에 들어갈 열
               columns='sex',           # 열 위치에 들어갈 열
               aggfunc=['mean', 'sum']) # 데이터 집계 함수

# 더 많은 열을 사용해서 피벗 데이블 구성
pd.pivot_table(df,            
               values=['age', 'fare'], 
               index=['class', 'sex'],
               columns='survived', 
               aggfunc=['mean', 'max'])

 

멀티 인덱스


# 타이타닉 데이터에서 'calss', 'sex' 열에 대해 그룹객체 생성
grouped = df.groupby(['class', 'sex'])
# 평균으로 집계 후 변수에 저장
gdf = grouped.mean()  #멀티 인덱스 상태
gdf

 

▶ 멀티 인덱스의 인덱싱

# 'class'열의 'First'행만 인덱싱
gdf.loc['First']

# 'First' 행의 'female' 행 인덱싱
gdf.loc[('First', 'female')]  # index를 차례로 찾아들어감

 멀티 인덱서 (.xs)

 

  • group객체.xs()  
  • 그룹 범주와 상관없이 소 인덱스를 따로 추출 (레벨 지정)
# 소 인덱스를 따로 추출 ( sex 열을 기준으로 male 추출)
gdf.xs('male', level='sex')

 

멀티 인덱스 해제

gdf.reset_index()

# 열이 멀티인덱스인 경우
gdf2 = df.groupby('class').agg(['mean','max'])[['age','fare']]
gdf2

# 열이름 새로 지정
gdf2.columns = ['age_mean', 'age_max', 'fare_mean','fare_max']
gdf2.head()

 

피벗테이블의 멀티인덱싱  응용


# 피벗 테이블 생성
pdf = pd.pivot_table(df,
                     index = ['class','sex'],
                     columns = 'survived',
                     values = ['age','fare'],
                     aggfunc = ['mean','max'])
pdf

# 'First' 그룹 인덱싱
pdf.xs('First')

# 'sex'열의 'male'행 인덱스
pdf.xs('male', level='sex')

# 'class'열의 'First'행, 'sex'열의 'female'행 인덱싱
pdf.xs(('First','female'), level=['class','sex'])

# 열의 멀티인덱싱 (axis=1)
# 'mean'열만 인덱싱
pdf.xs('mean', axis=1)

# 'mean'열의 'age'열 인덱싱
pdf.xs(('mean','age'), axis=1)