본문 바로가기
Python/Pandas

인덱스의 설정과 리셋(배정, set_index, reset_index)-pandas(21)

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

파이썬 버전 3.7 기준

pandas 버전 0.25.1 기준



 인덱스의 세팅과 재설정


본 포스팅에서는 인덱스를 세팅하고 리셋하는 방법에 대해서 다루도록 한다.



 인덱스의 세팅과 재설정


사용자는 경우에 따라서 DataFrame을 작성한 뒤에 인덱스를 새로 만들거나, 수정해야하는 상황이 있을 수 있다.

이런 경우에 사용자는 크게 3가지 방법을 통해 인덱스를 설정할 수 있다. 

  ○ DataFrame의 index 및 columns 어트리뷰트에 대한 직접 배정

  ○ set_index 메서드의 활용

  ○ reset_index 메서드의 활용 

  


 배정을 통한 인덱스 설정

DataFrame에는 index 및 columns 어트리뷰트를 가지고 있으며, 이 어트리뷰트에 배정이 가능하다. 

따라서 단순히 아래 형식과 같이 단순히 각 어트리뷰트에 배정을 수행하면 인덱스(index)와 열의 레이블(columns)를 간단히 수정할 수 있다.

  ○ 배정하는 배열의 길이를 기존의 index 및 columns의 길이와 정확히 일치시켜야한다.

     (일치하지 않을 경우 예외가 발생한다.)


배정의 사용형식)

Series.index = array

DataFrame.index = array

DataFrame.columns = array


array에는 index를 배정하려고 하는 배열을 입력받으며, 기존의 데이터와 길이가 동일해야한다.

  ○ array는 리스트나 ndarray 같은 배열 및 시퀀스(sequence)를 입력할 수 있다.


index 및 columns 배정 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언

In[4]: ex_df=pd.DataFrame(np.arange(0,9).reshape(3,3))

In[5]: ex_df

Out[5]: 

   0  1  2

0  0  1  2

1  3  4  5

2  6  7  8


# index 및 columns 어트리뷰트로의 배정

In[6]: ex_df.index=['r0','r1','r2']

In[7]: ex_df.columns=['c0','c1','c2']

In[8]: ex_df

Out[8]: 

    c0  c1  c2

r0   0   1   2

r1   3   4   5

r2   6   7   8



 DataFrame 내의 열을 이용한 인덱스 설정 (set_index 메서드)

DataFrame에는 set_index() 메서드를 적용할 수 있다.

  ○ 이 메서드는 열의 레이블(label) 혹은 열 레이블의 리스트(MultiIndex를 작성할 경우)을 입력받는다.

set_index 메서드는 아래와 같이 사용할 수 있다.


set_index 메서드 사용형식)

DataFrame.set_index(keys, drop=True, append=False, inplace=False)


keys는 인덱스로 세팅하려하는 열의 레이블을 입력받는다. 

  ○ 멀티인덱스의 경우 레이블의 배열을 입력받는다.

drop은 인덱스로 세팅한 열을 DataFrame내에서 삭제할지 여부를 결정한다. (선택적 입력 가능)

append는 기존에 존재하던 인덱스를 삭제할지 여부를 결정한다. (선택적 입력 가능)

inplace는 원본 객체를 변경할지 여부를 결정한다. (선택적 입력 가능)


set_index를 통해 DataFrame의 인덱스를 설정하는 예제는 다음과 같다.


set_index 메서드 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언

In[9]: ex_df=pd.DataFrame([[0,1,2,'r0'],[3,4,5,'r1'],[6,7,8,'r2']], columns=['c0','c1','c2','c4'])

In[10]: ex_df

Out[10]: 

   c0  c1  c2  c4

0   0   1   2  r0

1   3   4   5  r1

2   6   7   8  r2


# set_index 메서드의 적용

In[11]: ex_df.set_index('c4')

Out[11]: 

    c0  c1  c2

c4            

r0   0   1   2

r1   3   4   5

r2   6   7   8


drop 입력인자는 사용자에게 인덱스 세팅에 사용한 열을 삭제할 것인지 혹은 유지를 결정할 수 있게 해준다.

append 입력인자는 사용자에게 기존에 존재하는 인덱스를 유지시키고 새로운 인덱스를 추가할 것인지 여부를 결정해준다.

  ○ MultiIndex에도 마찬가지로 새로운 인덱스를 추가할 것인지 여부를 결정할 수 있게 해준다.

inplace는 여러 메서드들과 마찬가지로 원본 데이터를 변경할 것인지 복사본을 반환할 것인지 여부를 결정한다.


각 인자에 대한 사용 예제는 다음과 같다.


set_index의 입력변수 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언

In[12]: ex_df.set_index('c4',drop=False)

Out[12]: 

    c0  c1  c2  c4

c4                

r0   0   1   2  r0

r1   3   4   5  r1

r2   6   7   8  r2


# append 입력변수 사용

In[13]: ex_df.set_index('c4',append=True)

Out[13]: 

      c0  c1  c2

  c4            

0 r0   0   1   2

1 r1   3   4   5

2 r2   6   7   8

In[14]: ex_df       # inplace입력변수가 기본값으로 False이므로 원본 객체 변경되지 않음

Out[14]: 

   c0  c1  c2  c4

0   0   1   2  r0

1   3   4   5  r1

2   6   7   8  r2


# inplace입력변수 사용

In[15]: ex_df.set_index('c4',inplace=True)

In[16]: ex_df

Out[16]: 

    c0  c1  c2

c4            

r0   0   1   2

r1   3   4   5

r2   6   7   8



 DataFrame의 열의 리셋 (reset_index 메서드)

DataFrame에는 reset_index() 메서드가 존재한다.

  ○ 이 메서드는 인덱스를 리셋 시키는데 사용한다.

  ○ 기본값으로 인덱스 값들을 DataFrame의 열로 전송하며, 새로운 단순한 정수 인덱스를 세팅한다.

  ○ 즉, 이 메서드는 set_index()의 기능을 역으로 수행한다.

reset_index의 사용형식은 다음과 같다.


reset_index 메서드 사용형식)

DataFrame.reset_index(drop=False, inplace=False)


drop은 인덱스로 세팅한 열을 DataFrame내에서 삭제할지 여부를 결정한다.

inplace는 원본 객체를 변경할지 여부를 결정한다. 


reset_index 메서드는 set_index보다 사용하기 더 간단하며, 다음 예제는 사용 방법을 보여준다.


reset_index 메서드의 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열(위 예제의 결과 데이터프레임사용)

In[17]: ex_df

Out[17]: 

    c0  c1  c2

c4            

r0   0   1   2

r1   3   4   5

r2   6   7   8


# reset_index() 메서드의 적용

In[18]: ex_df.reset_index()

Out[18]: 

   c4  c0  c1  c2

0  r0   0   1   2

1  r1   3   4   5

2  r2   6   7   8


# 원본 객체는 변경되지 않음

In[19]: ex_df

Out[19]: 

    c0  c1  c2

c4            

r0   0   1   2

r1   3   4   5

r2   6   7   8


drop 입력인자는 사용자에게 인덱스 세팅에 사용한 열을 삭제할 것인지 혹은 유지를 결정할 수 있게 해준다.

inplace는 여러 메서드들과 마찬가지로 원본 데이터를 변경할 것인지 복사본을 반환할 것인지 여부를 결정한다.

각 인자에 대한 사용 예제는 다음과 같다.


reset_index 메서드 입력변수의 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 원본 데이터프레임

In[19]: ex_df

Out[19]: 

    c0  c1  c2

c4            

r0   0   1   2

r1   3   4   5

r2   6   7   8


# drop 입력변수의 적용

In[20]: ex_df.reset_index(drop=True)

Out[20]: 

   c0  c1  c2

0   0   1   2

1   3   4   5

2   6   7   8


# inplace 입력변수의 적용

In[21]: ex_df.reset_index(inplace=True)

In[22]: ex_df

Out[22]: 

   c4  c0  c1  c2

0  r0   0   1   2

1  r1   3   4   5

2  r2   6   7   8


인덱스로 있던 열의 레이블은 name 어트리뷰트에 저장된 값들을 사용한다.

멀티인덱스에서는 level 키워드를 사용하여 멀티인덱스의 한 부분을 리셋 시킬 수 있다.


reset_index 메서드의 멀티인덱스 적용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열(멀티인덱스) 선언

In[23]: ex_mul_index=pd.MultiIndex.from_product([['a0','a1'],['b0','b1','b2']], names=['a','b'])

In[24]: ex_mul_df=pd.DataFrame(np.arange(18).reshape(6,3),index=ex_mul_index)

In[25]: ex_mul_df

Out[25]: 

        0   1   2

a  b             

a0 b0   0   1   2

   b1   3   4   5

   b2   6   7   8

a1 b0   9  10  11

   b1  12  13  14

   b2  15  16  17


# 멀티인덱스로의 reset_index 메서드 적용

In[26]: ex_mul_df.reset_index(level=1)

Out[26]: 

     b   0   1   2

a                 

a0  b0   0   1   2

a0  b1   3   4   5

a0  b2   6   7   8

a1  b0   9  10  11

a1  b1  12  13  14

a1  b2  15  16  17



 각 메서드의 옵션 세부사항


 DataFrame.set_index(self, keys, drop=True, append=False, inplace=False, verify_integrity=False)

이 메서드는 DataFrame에 존재하는 칼럼 하나를 인덱스로 세팅한다.


DatatFrame 인덱스를 하나 혹은 그 이상의 존재하는 열을 이용하거나 혹은 배열(정확한 길이를 가지는)을 이용하여 세팅한다.

인덱스는 존재하는 인덱스를 대체하거나 혹은 추가할 수 있다.


keys: label, array-like, list of labels/arrays

이 파라미터는 열의 이름이나, DataFrame과 같은 길이를 가지는 배열, 존재하는 열 이름의 임의적인 조합의 리스트와 배열이 입력이 가능하다.

여기서 배열이라 함은 Series, Index, np.ndarray, 그리고 이터레이터(iterator)의 인스턴스를 의미한다.

 

drop: bool 

기본값으로 True가 입력되어 있다.

새로운 인댁스로서 사용된 열을 삭제할지 여부를 결정한다.

 

append: bool

기본값으로 False가 입력되어 있다.

기존에 존재하는 인덱스에 이어 붙일 것인지 여부를 결정한다.

 

verify_integrity: bool

기본값으로 False가 입력되어 있다.

새로운 인덱스에 중복여부를 확인한다. 

그렇지 않으면 필요해질 경우까지 확인하는 것을 미룬다.

False로 세팅하는 것은 이 메서드의 성능을 개선한다.



 DataFrame.reset_index(self, level=None, drop=False, inplace=False, col_level=0, col_fill='')

인덱스 혹은 인덱스 레벨을 리셋한다. 

 

DataFrame의 인덱스를 리셋하고, 기본값을 이것 대신으로 사용한다.

만약 DataFrame이 MultiIndex를 가질 경우 이 메서드는 하나 혹은 더 여러단계의 메서드를 삭제한다.


level: int, str, tuple, list

기본값은 None으로 입력되어 있다.

인덱스로부터 주어진 단계를 제거한다.

기본값으로는 모든 단게를 제거한다. 

 

drop: bool

기본값으로 False가 입력되어있다.

이 입력변수는 리셋하려는 인덱스를 DataFrame의 칼럼으로 추가하는지 여부를 결정한다.

이것은 인덱스를 기본 정수 인덱스로 리셋한다.

 

inplace: bool 

기본값으로 False가 입력되어 있다.

이 변수는 DataFrame을 제자리에서 수정할지 여부를 결정한다.

(True일 경우 새로운 객체를 만들지 않는다)


col_level: int, str, 

기본값은 0으로 입력되어 있다.

만약 열이 MultiIndex 단계를 가질 경우, 어떤 단계라벨로 삽입될 것인지 결정한다.

기본값으로는 이것은 첫번째 단계로 입력된다.

 

col_fill: object

기본값은 ''이다.

만약 열이 MultiIndex 단계를 가질 경우, 어떻게 다른 단계를 이름을 붙일것인지 결정한다.

만약 None인경우, 인덱스 이름은 반복된다.



 

 

 

 

 참고자료

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

  https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.set_index.html

  https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reset_index.html 

 

 

 

 


반응형

댓글