본문 바로가기
Python/Pandas

멀티인덱스(Multiindex)의 생성-pandas(41)

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

파이썬 버전 3.8 기준

pandas 버전 1.1.1 기준

 

 멀티인덱스 생성

 

본 포스팅에서는 멀티인덱스에 대한 소개와 생성하는 방법에 대해서 다루도록 한다.

이를 위해 from_arrays(), from_tuples(), from_product(), from_frame() 함수를 소개하며 이를 이용한 생성 예제를 다룬다.

 

 다단계 인덱싱(멀티인덱스)

 

멀티인덱스는 데이터 프레임에 여러 level(단계)의 인덱스를 넣는 것을 지칭한다.

즉, 인덱스를 다단계로 만들어 다차원 객체를 생성할 수 있다.

  ○ 다단계/멀티인덱싱은 꽤 정교한 데이터분석과 조작을 할 수 있게 한다.

   그중에서도 특히 높은 차원(Dimension)을 다루는데 유용하다.

  ○ 사용자에게 Series(1D)나 DataFrame(2D)같은 낮은 차원의 데이터 구조에서 더 고차원의 데이터를 저장하고 조작할 수 있게 한다.

 

초기 생성 객체별로 아래와 같은 다른 함수들을 이용하여 MultiIndex를 생성할 수 있다. 

  ○ 리스트의 배열: MultiIndex.from_arrays()

  ○ 튜플의 배열: MultiIndex.from_tuples()

  ○ 이터레이블의 교차된 세트: MultiIndex.from_product()

  ○ DataFrame: MultiIndex.from_frame()

 

함수의 사용 형식은 다음과 같다.


함수 사용 형식)

result=MultiIndex.from_arrays(arrays, sortorder=None, names=None)

result=MultiIndex.from_tuples(tuples, sortorder=None, names=None)

result=MultiIndex.from_product(iterables, sortorder=None, names=None)

result=MultiIndex.from_frame(df, sortorder=None, names=None)

 

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

  ○ 각 메서드별 입력객체

    ▷ arrays: array-likes 자료형의 시퀀스를 입력받는다.

      - 즉, 배열안에 배열이 있는 형태의 자료형을 입력받는다. 

      - 예제: [ array1, array2, array3 ]

    ▷ tuples: tuple-likes 자료형의 시퀀스를 입력받는다.

    ▷ iterables: iterable 자료형의 시퀀스를 입력받는다.

    ▷ df: 멀티인덱스로 변환될 DataFrame을 입력받는다.

  ○ sortorder: int형 자료형을 입력받으며 정렬시킬 level(단계)을 입력받는다.

  ○ names: str로 구성된 list-like자료형을 입력으며, level에 대한 명칭을 입력받는다.

 

 멀티인덱스 객체의 생성 예제

이 섹션에서는 다양한 방법을 통해 멀티인덱스를 생성시키는 예제들을 다룬다.

예제를 수행하기에 앞서 다음과 같이 모듈 import를 수행한다.

 

모듈의 임폴트)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np

 

아래 예제는 배열을 사용하여 MultiIndex를 생성하는 예제이다.

이를 위해 MultiIndex.from_arrays() 함수가 사용된다.


배열을 사용한 MultiIndex 생성)

# ex1: 배열을 사용한 MultiIndex의 생성 예제

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_index

Out[6]: 

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

            ('A', 'b'),

            ('B', 'a'),

            ('B', 'b'),

            ('C', 'a'),

            ('C', 'b'),

            ('D', 'a'),

            ('D', 'b')],

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


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

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

 

아래 예제는 튜플을 사용하여 MultiIndex를 생성하는 예제이다.

이를 위해 MultiIndex.from_tuples() 함수가 사용된다.

함수에 입력되는 자료형은 튜플로 구성된 시퀀스형 자료형이 입력될 수 있으며,

이 예제에서는 튜플의 리스트 형태로 입력을 하였다.


튜플을 사용한 MultiIndex 생성)

ex2: 튜플을 사용한 MultiIndex의 생성 예제

In[9]: ex_tuple=[('A','a'), ('A','b'), ('B','a'), ('B','b'), ('C','a'), ('C','b'), ('D','a'), ('D','b')]


In[10]: ex_index=pd.MultiIndex.from_tuples(ex_tuple, names=['ONE', 'TWO'])

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'])


사용자가 두개의 iterable에서 모든 요소를 연결하여 MultiIndex를 작성해야하는 경우가 있다. 

이런 경우에는 MultiIndex.from_product() 함수를 이용할 수 있다.


from_product 함수를 사용한 MultiIndex의 생성)

ex3: from_product 함수를 사용한 MultiIndex의 생성 예제

In[12]: ex_prod=[['A','B','C','D'],['a','b']]

In[13]: ex_index=pd.MultiIndex.from_product(ex_prod, names=['ONe', 'TWo'])


In[14]: ex_index

Out[14]: 

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

            ('A', 'b'),

            ('B', 'a'),

            ('B', 'b'),

            ('C', 'a'),

            ('C', 'b'),

            ('D', 'a'),

            ('D', 'b')],

           names=['ONe', 'TWo'])

 

만약 사용자가 MultiIndex를 DataFrame에서 직접 가져와 생성하길 원하다면, MultiIndex.from_frame()을 사용하면된다.

 

from_frame 함수를 사용한 MultiIndex의 생성)

ex4: from_frame 함수를 사용한 MultiIndex의 생성 예제

In[15]: ex_df=pd.DataFrame([['A','a'], ['A','b'], ['B','a'], ['B','b'], ['C','a'], ['C','b'], ['D','a'], ['D','b']], columns=['1', '2'])

In[16]: ex_index=pd.MultiIndex.from_frame(ex_df)


In[17]: ex_index

Out[17]: 

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

            ('A', 'b'),

            ('B', 'a'),

            ('B', 'b'),

            ('C', 'a'),

            ('C', 'b'),

            ('D', 'a'),

            ('D', 'b')],

           names=['1', '2'])

 

pandas는 MultiIndex를 생성할때 편리하게도 배열의 리스트를 직접 입력하는 것이 가능하다.

아래 예제는 Multiindex를 자동적으로 생성하기 위해 배열의 리스트를 직접 Series나 DataFrame에 입력하는 예제를 보여준다.

 

배열로 구성된 리스트 직접입력을 통한 MultiIndex 생성)

ex5: 배열의 리스트를 직접입력한 MultiIndex의 생성 예제

In[18]: ex_list=[['A','A','B','B','C','C','D','D'], ['a','b','a','b','a','b','a','b']]


In[19]: ex_s=pd.Series(range(8,16), index=ex_list)

In[20]: ex_s

Out[20]: 

A  a     8

   b     9

B  a    10

   b    11

C  a    12

   b    13

D  a    14

   b    15

dtype: int64


In[21]: ex_df_mul=pd.DataFrame((range(0,3), range(3,6), range(6,9), range(9,12), range(12,15), range(15,18), range(18,21), range(21,24)), index=ex_list)


In[22]: ex_df_mul

Out[22]: 

      0   1   2

A a   0   1   2

  b   3   4   5

B a   6   7   8

  b   9  10  11

C a  12  13  14

  b  15  16  17

D a  18  19  20

  b  21  22  23


모든 Multiindex 생성자는 names 입력변수를 가지고 있다.

이 변수는 각 level(단계)에서의 문자열(string) 이름을 저장한다.

만약 names가 입력되지 않는다면 None이 배정된다.

 

MultiIndex의 level별 이름)

# MultiIndex의 level별 이름 

In[23]: ex_df_mul.index.names

Out[23]: FrozenList([None, None])

 

위에서는 행에 Multiindex만 적용하였다.

하지만 열에 대해서도 마찬가지로 Multiindex를 생성할 수 있다. 

그리고 인덱스 객체의 경우 슬라이스를 사용하여 인덱스의 크기를 조절하는 것이 가능하다.


열의 MultiIndex의 생성 및 인덱스 객체의 슬라이스 적용)

# ex6-1: 열로의 MultiIndex 적용 예제

In[24]: ex_list=[['A','A','B','B','C','C','D','D'], ['a','b','a','b','a','b','a','b']]

In[25]: ex_df_mul=pd.DataFrame([range(0,8), range(8,16), range(16,24)], columns=ex_list)


In[26]: ex_df_mul

Out[26]: 

    A       B       C       D    

    a   b   a   b   a   b   a   b

0   0   1   2   3   4   5   6   7

1   8   9  10  11  12  13  14  15

2  16  17  18  19  20  21  22  23


# ex6-2: MultiIndex객체의 슬라이스 적용 예제

In[27]: ex_index=pd.MultiIndex.from_arrays(ex_list)


In[28]: ex_df_mul=pd.DataFrame([range(0,6), range(6,12), range(12,18)], columns=ex_index[:6])

In[29]: ex_df_mul

Out[29]: 

    A       B       C    

    a   b   a   b   a   b

0   0   1   2   3   4   5

1   6   7   8   9  10  11

2  12  13  14  15  16  17

 

축에 멀티인덱스를 입력할 시 튜플로 구성된 시퀀스형 자료형을 직접 입력될 경우 해당 튜플자체가 레이블이 되는 경우가 있으므로 주의가 필요하다.


튜플 자체가 레이블이 되는 경우)

# 튜플 자체가 레이블이 되는 경우

In[9]: ex_tuple=[('A','a'), ('A','b'), ('B','a'), ('B','b'), ('C','a'), ('C','b'), ('D','a'), ('D','b')]


In[30]: ex_s=pd.Series(range(8),index=ex_tuple)

In[31]: ex_s

Out[31]: 

(A, a)    0

(A, b)    1

(B, a)    2

(B, b)    3

(C, a)    4

(C, b)    5

(D, a)    6

(D, b)    7

dtype: int64


# MultiIndex가 아닌 것을 확인

In[32]: ex_s.index

Out[32]: 

Index([('A', 'a'), ('A', 'b'), ('B', 'a'), ('B', 'b'), ('C', 'a'), ('C', 'b'),

       ('D', 'a'), ('D', 'b')],

      dtype='object')

  
 

 메서드 세부사항

 

 

 MultiIndex.from_arrays(arrays, sortorder=None, names=None)

배열을 멀티인덱스로 변환한다.

 

arrays: list/sequence of array-likes

멀티인덱스로 변환할 배열을 입력받는다.

입력된 배열의 조합을 통해 멀티인덱스를 생성한다.

배열의 길이는 단계의 길이 수와 동일하다.


sortorder: int, None

정렬시킬 level(단계)를 입력한다.

반드시 해당 level(단계)에 의해 정렬되어져야 한다.


names: list/sequence of str
선택적으로 입력 가능하다.
인덱스에다 단계에 대한 이름을 입력받는다.

 MultiIndex.from_tuples(tuples, sortorder=None, names=None)

튜플의 리스트를 멀티인덱스로 변환한다.

 

tuples: list/sequence of tuple-likes

멀티인덱스로 변환할 튜플로 구성된 시퀀스형 자료형을 입력받는다.

각각의 튜플은 행/열의 인덱스이다.


sortorder: int, None

정렬시킬 level(단계)를 입력한다.

반드시 해당 level(단계)에 의해 정렬되어져야 한다.


names: list/sequence of str
선택적으로 입력 가능하다.
인덱스에다 단계에 대한 이름을 입력받는다.


 MultiIndex.from_product(iterables, sortorder=None, names=None)

다수의 이터레이블의 직각좌표계의 프로덕트로부터 멀티인덱스를 생성한다.

 

iterable: list/sequence of iterable

멀티인덱스를 생성할 이터레이블을 입력받는다.

입력된 이터레이블의 조합을 통해 멀티인덱스를 생성한다. 

각각의 이터레이블은 인덱스의 각각의 단계에 대한 유일한 레이블을 가진다.


sortorder: int, None

정렬시킬 level(단계)를 입력한다.

반드시 해당 level(단계)에 의해 정렬되어져야 한다.


names: list/sequence of str
선택적으로 입력 가능하다.
인덱스에다 단계에 대한 이름을 입력받는다.


 MultiIndex.from_frame(df, sortorder=None, names=None)

DataFrame으로부터 멀티인덱스를 생성한다.

 

df: DataFrame

멀티인덱스로 변환될 DataFrame이다.


sortorder: int, None

정렬시킬 level(단계)를 입력한다.

반드시 해당 level(단계)에 의해 정렬되어져야 한다.


names: list/sequence of str
선택적으로 입력 가능하다.
만약 names가 입력되지 않는다면, 열의 names 혹은 열이름의 튜플을 사용한다. (만약 열이 멀티인덱스라면)
만약 시퀀스가 입력될 경우 입력된 시퀀스를 사용하여 이름을 덮어쓴다.
 

반응형

댓글