본문 바로가기
Python/Pandas

멀티인덱스(MultiIndex)의 인덱싱(indexing)-pandas(43)

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

파이썬 버전 3.8 기준

pandas 버전 1.1.4 기준

 

 멀티인덱스(MultiIndex)의 인덱싱(indexing)


본 포스팅에서는 멀티인덱스를 인덱싱하는 방법에 대해서 다루도록 한다.

이를 위해 대괄호 [ ]를 활용하는 방법과 .loc메서드를 이용하여 다루는 방법을 소개한다.

이외에 슬라이싱(slicing)을 이용한 데이터 선택에 대해서도 간략히 소개한다.

멀티인덱스가 아닌 일반적인 인덱싱에 대한 방법은 선행 포스팅(링크)를 참고할 수 있다.

 

 MultiIndex의 기본적인 인덱스 방법

 

멀티인덱스(MultiIndex)의 인덱싱의 중요한 기능 중 하나는 사용자가 레이블로 데이터를 선택할 수 있다는 점이다. 

데이터 선택은 DataFrame에서 열을 선택할 때랑 유사하게 작동한다.

  

 열(Column)의 멀티인덱스 선택

예제를 수행하기에 앞서 다음과 같이 모듈의 import와 멀티인덱스를 보유하는 DataFrame을 정의한다.

 

모듈의 임폴트 및 예제용 DataFrame의 정의)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


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_df_mul=pd.DataFrame([range(x*8,x*8+8) for x in range(8)], index=ex_index, columns=ex_index)

In[7]: ex_df_mul

Out[7]: 

one       A       B       C       D    

two       a   b   a   b   a   b   a   b

one two                                

A   a     0   1   2   3   4   5   6   7

    b     8   9  10  11  12  13  14  15

B   a    16  17  18  19  20  21  22  23

    b    24  25  26  27  28  29  30  31

C   a    32  33  34  35  36  37  38  39

    b    40  41  42  43  44  45  46  47

D   a    48  49  50  51  52  53  54  55

    b    56  57  58  59  60  61  62  63

 

대괄호 [ ]를 활용하면 DataFrame 열(column)의 멀티인덱스를 선택할 수 있다.

아래 예제는 대괄호 [ ]을 다양한 방식으로 활용하여 DataFrame 멀티인덱스를 인덱싱하는 방법을 보여준다.

 

DataFrame 멀티인덱스의 인덱싱)

# [ ]을 사용한 열의 멀티인덱스 인덱싱

In[8]: ex_df_mul['A']

Out[8]: 

two       a   b

one two        

A   a     0   1

    b     8   9

B   a    16  17

    b    24  25

C   a    32  33

    b    40  41

D   a    48  49

    b    56  57


# [ , ]을 사용한 열의 멀티인덱스 인덱싱

In[9]: ex_df_mul['A','b']

Out[9]: 

one  two

A    a       1

     b       9

B    a      17

     b      25

C    a      33

     b      41

D    a      49

     b      57

Name: (A, b), dtype: int64


# [ ][ ]을 사용한 열의 멀티인덱스 인덱싱

In[10]: ex_df_mul['A']['b']

Out[10]: 

one  two

A    a       1

     b       9

B    a      17

     b      25

C    a      33

     b      41

D    a      49

     b      57

Name: b, dtype: int64


아래 예제는 Series 멀티인덱스의 인덱싱을 보여준다. 

아래에서 보시는 것과 같이 DataFrame과 유사하게 사용할 수 있다.


Series 멀티인덱스의 인덱싱)

# pandas와 numpy의 import

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


In[12]: ex_s['A']

Out[12]: 

two

a    0

b    1

dtype: int64


In[13]: ex_s['D','a']

Out[13]: 6


In[14]: ex_s['D']['a']

Out[14]: 6


 다단계 인덱스를 사용한 고급인덱싱

 

pandas에서는 .loc를 활용하여 고급인덱싱을 수행할 수 있다.

일반적으로 MultiIndex의 키는 튜플의 형태를 가진다. 

 

※ 참고사항

멀티인덱스에서 iloc메서드와 loc메서드는 완전히 다른 거동을 보여준다.

loc는 레이블을 선택하지만, iloc는 정수 좌표를 선택하는 방식이다.

각각의 요소에는 단일 level로 정수좌표가 입력되어 있기 때문에 iloc는 멀티인덱스를 인식하지 않는다.   


멀티인덱스의 iloc 메서드 사용)

In[23]: ex_df_mul.iloc[(1,1)]

Out[23]: 9


 

 

 .loc메서드를 통한 행(row)의 멀티인덱스 선택

다음 예제는 .loc 메서드를 통해 데이터를 선택하여 출력하는 것을 보여준다. 

다음과 같이 튜플을 통해 특정 위치의 Serie를 출력하는 것이 가능하다. 

 

.loc 메서드를 사용한 데이터 선택 예제)

# .loc 메서드를 사용한 데이터 선택 예제 1

In[15]: ex_df_mul.loc[('B','a')]

Out[15]: 

one  two

A    a      16

     b      17

B    a      18

     b      19

C    a      20

     b      21

D    a      22

     b      23

Name: (B, a), dtype: int64

 

# .loc 메서드를 사용한 데이터 선택 예제 2

In[16]: ex_df_mul.loc[('B','a'), 'C']

Out[16]: 

two

a    20

b    21

Name: (B, a), dtype: int64

 

# .loc 메서드를 사용한 데이터 선택 예제 3

In[17]: ex_df_mul.loc[('B','a'), ('C','b')]

Out[17]: 21

 

아래 예제에서  .loc['B', 'a']의 입력형식 작동하지만, 이 형식은 애매한 표현이다.

만약 사용자가 특정 열을 .loc를 사용하여 인덱싱을 하길 원한다면, 튜플을 사용하는 것을 권장한다.

 

.loc 메서드를 사용한 데이터 선택 예제)

In[18]: ex_df_mul.loc['B','a']

Out[18]: 

one  two

A    a      16

     b      17

B    a      18

     b      19

C    a      20

     b      21

D    a      22

     b      23

Name: (B, a), dtype: int64


사용자는 튜플의 첫번째 요소만 압력하는 것에 의해 MultiIndex의 모든 단계를 명시할 순 없다.

예를들어, 사용자는 첫번째 level(단계)에 특정 데이터 세트를 얻기 위해 인덱싱을 사용할 수 있다.

  ○ .loc['B']로 표기할 수 있다. 

    ▷ 이는 더 장황한 표현방식인 df.loc[('B', ), ]에 대한 축약표현이다.

    ▷ 여기서는 .loc['B', ]와 동등하다.


가장 상위 level에 해당하는 하나의 데이터 세트 선택 예제)

In[19]: ex_df_mul.loc['C']

Out[19]: 

one   A       B       C       D    

two   a   b   a   b   a   b   a   b

two                                

a    32  33  34  35  36  37  38  39

b    40  41  42  43  44  45  46  47



 .loc메서드 슬라이싱 사용

멀티인덱스에서도 일반적인 인덱싱과 마찬가지로 슬라이싱이 가능하다.

사용자는 튜플의 슬라이스를 제공함으로써 값의 범위를 사용하여 슬라이싱 할 수 있다.

 

슬라이싱 사용)

# 슬라이싱의 사용 예제 1

In[19]: ex_df_mul.loc['B':'D']

Out[19]: 

one       A       B       C       D    

two       a   b   a   b   a   b   a   b

one two                                

B   a    16  17  18  19  20  21  22  23

    b    24  25  26  27  28  29  30  31

C   a    32  33  34  35  36  37  38  39

    b    40  41  42  43  44  45  46  47

D   a    48  49  50  51  52  53  54  55

    b    56  57  58  59  60  61  62  63


# 슬라이싱의 사용 예제 2

In[20]: ex_df_mul.loc[('B','b'):('D','a')]

Out[20]: 

one       A       B       C       D    

two       a   b   a   b   a   b   a   b

one two                                

B   b    24  25  26  27  28  29  30  31

C   a    32  33  34  35  36  37  38  39

    b    40  41  42  43  44  45  46  47

D   a    48  49  50  51  52  53  54  55


# 슬라이싱의 사용 예제 3

In[21]: ex_df_mul.loc[('B','b'):('D','a'), 'B':'C']

Out[21]: 

one       B       C    

two       a   b   a   b

one two                

B   b    26  27  28  29

C   a    34  35  36  37

    b    42  43  44  45

D   a    50  51  52  53

 

튜플 혹은 레이블의 리스트를 입력하는 것은 reindexing과 유사하게 작동한다.

 

모듈의 임폴트)

# pandas와 numpy의 import

In[22]: ex_df_mul.loc[[('B','a'), ('D','b')]]

Out[22]: 

one       A       B       C       D    

two       a   b   a   b   a   b   a   b

one two                                

B   a    16  17  18  19  20  21  22  23

D   b    56  57  58  59  60  61  62  63

 

※ 참고사항

튜플과 리스트가 인덱싱을 할 때 pandas에서는 동등하게 처리되지 않는다는 것을 인지하는 것은 중요하다. 

  ○ 튜플은 하나의 멀티인덱스의 키로서 처리가되는 반면, 리스트는 몇개의 키를 명시하기 위해 사용된다.

  ○ 다른 말로 표현하자면, 튜플은 수평적이고, 리스트는 수직적이다.

중요하게도, 튜플의 리스트는 몇몇의 완벽한 MultiIndex 키들을 인덱스할 수 있다. 

반면에, 리스트의 튜플은 하나의 단계내에서 몇몇의 값만 참조할 수 있다. 

 

 

 

 

 

 

 참고자료

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

 

 

 

 

 

반응형

댓글