
시작하기 전에 import 하기
import numpy as np import pandas as pd import numba from pandas import DataFrame from datetime import datetime
DataFrame.xs(key, axis=0, level=None, drop_level=True)
xs는 멀티인덱스 객체에 대해서 하위 분류를 출력하는 메서드입니다.
기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.xs(key, axis=0, level=None, drop_level=True)
key : 분류의 기준이 되는 값입니다. Multi Index의 값을 지정합니다.
axis : 하위 분류 출력의 기준이되는 축을 지정합니다.
level : 멀티인덱스에 키가 부분적으로 포함되어있는경우, 레벨 지정을 통해 분류할 수 있습니다.
drop_level : 기본값은 True로 필터링하는 값을 제외하고 하위 분류만 출력합니다. False면 필터링하는 값이 있는 분류까지 출력합니다.
먼저 기본적인 사용법 예시를위하여 멀티인덱스 데이터를 만들어보겠습니다.
data = {'col1':[0,1,2,3,4], 'col2':[5,6,7,8,9], 'level0':['A','A','A','B','B'], 'level1':['X','X','Y','Y','Z'], 'level2':['a','a','b','c','a']} df = pd.DataFrame(data=data) df = df.set_index(['level0', 'level1', 'level2']) print(df)
기본적인 사용법
기본적으로 key값을 지정하면 해당 값의 하위 분류를 출력합니다.print(df.xs(key='A'))
key값을 여러 값으로 지정할 수 도 있습니다.
print(df.xs(key=('A','X')))
level을 지정하여 하위분류를 진행할 수 있습니다.
print(df.xs(key='Y',level=1))
drop_level=True로 할 경우 key값으로 지정된 레벨을 포함해서 줄력합니다.
print(df.xs(key='Y',level=1,drop_level=False))
DataFrame.stack(level=- 1, dropna=True)
stack 메서드는 열을 피벗하여 하위 인덱스로 변환하는 메서드입니다.
기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.stack(level=- 1, dropna=True)
level : MultiColumns의 경우 하위인덱스로 변환할 열의 레벨입니다. 기본값은 -1로 최하위 레벨이 선택됩니다. dropna : {True / False} 기본값은 True로 피벗화로인해 생성된 하위인덱스의 모든 값이 결측치(NaN)인 경우 해당 열이 제거됩니다.
먼저 기본적인 사용법 예시를위하여 멀티인덱스 데이터를 만들어보겠습니다.
data = [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]] idx = [['idx1','idx1','idx2','idx2'],['row1','row2','row3','row4']] col = [['val1','val1','val2','val2'],['col1','col2','col3','col4']] df = pd.DataFrame(data = data, index = idx, columns = col) print(df)
기본적인 사용법
'level'의 기본값은 '-1'로 최하위 레벨이 선택됩니다. 위 df에서는 level=1이 최하위 계층이기 때문에,
df.stack( ) = df.stack(level=1) 입니다. 함수 실행 시 level=1의 열이 인덱스로 피벗된걸 확인할 수 있습니다.print(df.stack())
dropna인수의 사용
dropna인수는 기본값이 True로 열이 피벗화된 인덱스의 값이 NaN이면 해당 열을 출력하지 않습니다.
예시를 위해 간단한 2x2 짜리 데이터를 만들어보겠습니다.data = [[np.nan,1],[2,3]] idx = ['row1','row2'] col = ['col1','col2'] df = pd.DataFrame(data = data, index = idx, columns = col) print(df)
stack메서드를 사용할 경우 col1, col2 열이 인덱스로 피벗화되는데, row1-col1의 값은 NaN이기 때문에 출력에서는 아래와같이 제거됩니다.
print(df.stack())
dropna=True로 출력 할 경우 결측값을 갖는 열 또한 정상적으로 출력되는것을 볼 수 있습니다.
print(df.stack(dropna=False))
DataFrame.unstack(level=- 1, fill_value=None)
unstack 메서드는 행을 언피벗하여 하위 열로 변환하는 메서드입니다.
※ 열을 피벗하여 하위 행으로 변환하는 stack과 반대 개념입니다.
기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.unstack(level=- 1, fill_value=None)
level : MultiIndex의 경우 하위열로 변환할 행의 레벨입니다. 기본값은 -1로 최하위 레벨이 선택됩니다.
fill_value : 생성된 열의 값에 결측치가 있을 경우 대체할 값입니다.
먼저 기본적인 사용법 예시를위하여 멀티인덱스 데이터를 만들어보겠습니다.
data =[1,2,3,4,5] idx = [['idx1','idx1','idx2','idx2','idx2'],['row1','row2','row1','row2','row3']] df = pd.Series(data=data, index = idx) print(df)
기본적인 사용법
level은 기본값이 -1이며, 최하위 레벨의 행에 대해 열로 언피벗 합니다.
아래 예시를 보면 최 하위 계층인 row1,row2가 속한 인덱스가 열로 언피벗 된것을 확인할 수 있습니다.print(df.unstack())
fill_value 인수를 사용할 경우, 언피벗으로 인해 행성된 결측치를 특정 값으로 지정할 수 있습니다.
print(df.unstack(fill_value='-'))
좀 더 큰 다중인덱스에 대해서 예시를 들어보기위해 4레벨의 멀티인덱스를 생성해보겠습니다.
data = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] level0=['idx1','idx1','idx1','idx1','idx1','idx1','idx1','idx1', 'idx2','idx2','idx2','idx2','idx2','idx2','idx2','idx2'] level1=['row1','row1','row1','row1','row2','row2','row2','row2', 'row3','row3','row3','row3','row4','row4','row4','row4'] level2=['val1','val1','val2','val2','val1','val1','val2','val2', 'val1','val1','val2','val2','val1','val1','val2','val2'] level3=['col1','col2','col3','col4','col1','col2','col3','col4', 'col1','col2','col3','col4','col1','col2','col3','col4'] idx = [level0,level1,level2,level3] df = pd.Series(data =data, index =idx) print(df)
val1, val2가 속한 level=2로 unstack메서드를 실행해보겠습니다.
print(df.unstack(level=2))
level에 튜플을 이용하여 Multi Columns로 unstack을 실행할 수 있습니다.
print(df.unstack(level=(2,3)))
DataFrame.swaplevel(i=- 2, j=- 1, axis=0)
swaplevel메서드는 Multi Index (또는 Munti Columns)에서 두 인덱스의 순서를 변경하는 메서드입니다.
기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df..swaplevel(i=- 2, j=- 1, axis=0)
i , j : 순서를 변경할 두 인덱스의 레벨입니다. 기본적으로 제일 낮은 두 레벨의 인덱스가 교환됩니다.(-2, -1)
axis : 기본값은 0으로 axis=1로 변경할 경우 Multi Columns에 대해 메서드가 수행됩니다.
먼저 기본적인 사용법 예시를위하여 멀티인덱스 데이터를 만들어보겠습니다.
data = {'col':[0,1,2,3,4,5]} level0 = ['idx1','idx1','idx1','idx1','idx2','idx2'] level1 = ['val1','val1','val2','val2','val3','val4'] level2 = ['row1','row2','row3','row4','row5','row6'] idx = [level0, level1, level2] df = pd.DataFrame(data = data, index=idx) print(df)
기본적인 사용법
i, j인수에 아무것도 입력하지 않는다면, 제일 낮은 두 레벨의 인덱스가 교환됩니다.print(df.swaplevel())
인수로 한 숫자만 입력하게되면, 가장 낮은 레벨의 인덱스와 인수로 입력한 숫자에 해당하는 레벨의 인덱스가 교환됩니다.
print(df.swaplevel(0))
두 값을 지정하여 원하는 인덱스끼리의 교환이 가능합니다. 레벨명이 있다면 레벨명을 쓸 수도 있습니다.
print(df.swaplevel(i=0,j=1))
DataFrame.droplevel(level, axis=0)
droplevel 메서드는 Multi Index나 Multi Columns에서 특정 레벨을 제거하는 메서드입니다.
기본 사용법
※ 자세한 내용은 아래 예시를 참고 바랍니다.
df.droplevel(level, axis=0)
level : 제거할 단계 입니다.
axis : 특정 레벨을 제거할 축 입니다.
먼저 기본적인 사용법 예시를위하여 멀티인덱스 데이터를 만들어보겠습니다.
data= [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]] idx = [['idx1','idx1','idx2','idx2'],['row1','row2','row3','row4']] col = [['col1','col1','col2','col2'],['val1','val2','val3','val4']] df = pd.DataFrame(data=data, index = idx, columns = col) print(df)
기본적인 사용법
level에 제거를 원하는 레벨을 입력함으로서 해당 레벨을 제거하여 값을 출력할 수 있습니다.
level=0인 경우 Multi Index의 level=0인 idx1, idx2가 제거된 것을 알 수 있습니다.print(df.droplevel(axis=0,level=0))
level=1인 경우 Multi Index의 level=1인 row1, row2, row3, row4가 제거된 것을 알 수 있습니다.
print(df.droplevel(axis=0,level=1))
axis=1인 경우 Multi Columns에 대해서 특정 레벨을 제거 할 수 있습니다.
(실행 결과1)print(df.droplevel(axis=1,level=0))
(실행 결과2)print(df.droplevel(axis=1,level=1))