본문 바로가기
Python/Pandas

멀티인덱스 레이블의 추출과 비사용 level의 제거-pandas(42)

by 콩돌 2020. 11. 5.
반응형

파이썬 버전 3.8 기준

pandas 버전 1.1.1 기준

 

 멀티인덱스 레이블의 추출과 비사용 level의 제거

 

본 포스팅에서는 멀티인덱스(MultiIndex)의 특정 level(단계)의 레이블을 추출하고, 사용하지 않는 level(단계)를 삭제하는 방법에 대해 다루도록 한다.

이를 위해 get_level_values() 메서드와 remove_unused_levels() 메서드를 소개한다.

 

 

 특정 level 레이블의 추출을 위한 get_level_values() 메서드

   

사용자가 MultiIndex에서 특정 level(단계)의 레이블을 추출해야하는 경우에는, get_level_values() 메서드를 이용하면된다.

get_level_values() 메서드는 특정 level에서 각각의 위치에 대한 레이블의 벡터를 반환한다.

 

메서드의 사용 형식은 다음과 같다.


메서드 사용 형식)

result=MultiIndex.get_level_values(level)

 

각 입력 객체별 설명은 다음과 같다.

  ○ level: 레이블을 추출하기 위한 level(단계)를 입력받는다.

    ▷ level의 위치를 나타내는 정수(int) 혹은 level의 name(str)을 입력받는다.  

 

 

 get_level_values() 메서드 사용 예제 

다음은 get_level_values() 메서드의 사용 예제를 보여준다. 

예제를 수행하기에 앞서 사용하는 모듈을 import하고 객체의 정의 등이 선행되었다. 

아래 예제에서는 Series의 인덱스에만 적용하였다.

만약 DataFrame에서 Columns가 MultiIndex라면 DataFrame.columns 객체에도 해당 메서드가 적용이 가능하다. 

 

메서드 사용 예제)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제 수행을 위한 인덱스 객체와 Series의 정의 

In[4]: ex_array=np.array([['A','A','B','B','C','C','D','D'], ['a','b','a','b','a','b','a','b']])

In[5]: ex_index=pd.MultiIndex.from_arrays(ex_array, names=['one', 'two'])

In[6]: ex_s=pd.Series(range(8), index=ex_index)

In[7]: ex_index

Out[7]: 

MultiIndex([('A', 'a'),

            ('A', 'b'),

            ('B', 'a'),

            ('B', 'b'),

            ('C', 'a'),

            ('C', 'b'),

            ('D', 'a'),

            ('D', 'b')],

           names=['one', 'two'])

In[8]: ex_s

Out[8]: 

one  two

A    a      0

     b      1

B    a      2

     b      3

C    a      4

     b      5

D    a      6

     b      7

dtype: int64


# get_level_values() 메서드 사용 예제

In[9]: ex_s.index.get_level_values(0)

Out[9]: Index(['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D'], dtype='object', name='one')


In[10]: ex_s.index.get_level_values('two')

Out[10]: Index(['a', 'b', 'a', 'b', 'a', 'b', 'a', 'b'], dtype='object', name='two')

 

 

 MultiIndex.get_level_values(self, level)

요구되는 단계에 대해 레이블 값의 벡터를 반환한다.

인덱스의 길이와 동일해야한다.

 

level: int, str

level은 MultiIndex에서 단계의 정수의 위치이거나 level의 이름이다.

  

 

 사용하지 않는 level의 제거

 

멀티인덱스는 실제로 사용하지 않더라도 인덱스의 정의가 되어있는 level(단계)의 정보를 보유한다.

다음과 같이 인덱스를 슬라이스 한 경우에 몇몇 level(단계)들이 제거되지만 해당 정보는 계속 보유하고 있는 것을 확인할 수 있다.

 

메서드 적용하기 전의 상황)

# 기존에 존재하던 MultiIndex

In[11]: ex_index

Out[11]: 

MultiIndex([('A', 'a'),

            ('A', 'b'),

            ('B', 'a'),

            ('B', 'b'),

            ('C', 'a'),

            ('C', 'b'),

            ('D', 'a'),

            ('D', 'b')],

           names=['one', 'two'])


In[12]: ex_index.levels

Out[12]: FrozenList([['A', 'B', 'C', 'D'], ['a', 'b']])


# MultiIndex의 슬라이스

In[13]: ex_index[:2]

Out[13]: 

MultiIndex([('A', 'a'),

            ('A', 'b')],

           names=['one', 'two'])


In[14]: ex_index[:2].levels

Out[14]: FrozenList([['A', 'B', 'C', 'D'], ['a', 'b']])  # 사용되지 않으나 남아있는 정보들

 

위 상황에서 사용하지 않는 'B', 'C', 'D' 정보를 삭제하기 위해서 remove_unused_levels() 메서드를 활용하여 MultiIndex를 재구성할 수 있다.

 

메서드 적용과 결과 예제)

# remove_unused_levels() 메서드의 적용 예제

In[15]: ex2_index=ex_index[:2].remove_unused_levels()

In[16]: ex2_index

Out[16]: 

MultiIndex([('A', 'a'),

            ('A', 'b')],

           names=['one', 'two'])


In[17]: ex2_index.levels

Out[17]: FrozenList([['A'], ['a', 'b']])   # 사용되지 않은 정보들의 삭제 


 

 MultiIndex.remove_unused_levels(self)

사용되지 않는 단계를 삭제하여 새로운 멀티인덱스를 만든다.

여기서 레이블 안에서 표현되지 않는 것들을 의미한다.


결과 출력되는 MultiIndex는 동일한 외형을 가진다. 

이는 동일한 .values 및 순서를 의미한다. 

또한 원본과 .equals()가 된다. 

 

  

 

 

 

 

 참고자료

  https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html

  https://pandas.pydata.org/docs/reference/api/pandas.MultiIndex.get_level_values.html

  https://pandas.pydata.org/docs/reference/api/pandas.MultiIndex.remove_unused_levels.html

 

 

 

 

 

반응형

댓글