본문 바로가기
Python/Pandas

index(인덱스)객체의 생성, 개요, 처리방법-pandas(20)

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

파이썬 버전 3.7 기준

pandas 버전 0.25.1 기준



 index(인덱스) 객체 개요


본 포스팅에서는 인덱스 객체의 생성, 개요, 처리방법 등에 대해 다룬다.



 index 객체의 개요, 생성 및 데이터 설정


pandas에는 index 객체 또한 존재하며 다음과 같은 특징을 가진다.

  ○ Index 객체는 pandas의 모든 객체에 대한 축 레이블(label)을 저장하는 기본 객체이다.

  ○ 기본적으로 불변형 ndarray이며, 순서가 있고 슬라이스가 가능하다.

  ○ Index 클래스와 서브클래스는 순서가 있는 다중집합이라 여겨도된다.

  ○ 중복데이터 또한 입력이 가능하다.

  ○ Index 객체는 검색/색인, 데이터 정렬, 리인덱싱을 위한 다양한 기능들이 존재한다.



 Index 객체의 생성

다음은 pandas에서 인덱스를 생성하는 방법에 대한 설명과 예제이다. 

  ○ Index를 직접적으로 가장 쉽게 만드는 것은 리스트(list)나 다른 시퀀스를 인덱스로 입력하는 것이다.

  ○ 사용자가 인덱스에 저장되어지는 name을 입력할 수 있다.

  ○ 필요하다면, 세팅된 index와 index의 name은 콘솔디스플레이에 볼 수 있다.


인덱스 객체 생성 형식)

Index=pandas.index(sequence, name=None)


여기서 sequence는 배열과 같은 자료형을 입력으로 받는다.

name은 인덱스 객체에 name 어트리뷰트에 배정할 인덱스 객체의 이름을 입력받는다.


index 객체 생성 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# index 객체 생성 예제 1

In[4]: ex_index=pd.Index(['a','b','c'])

In[5]: ex_index

Out[5]: Index(['a', 'b', 'c'], dtype='object')


# index 객체 생성 예제 2 (name의 입력)

In[6]: ex_index=pd.Index(['a','b','c'], name='name_index')

In[7]: ex_index

Out[7]: Index(['a', 'b', 'c'], dtype='object', name='name_index')



 메타데이터(metadata)의 세팅

앞서 서술했듯이 index 객체는 기본적으로는 불변적이다. 

하지만 인덱스의 메타데이터(metadata)는 index객체의 name처럼(혹은 MultiIndex, level, code) 설정되고 변경되는 것이 가능하다.


인덱스 객체 설정 및 설정변경을 위해 rename, set_names, set_levels, set_codes 메서드를 사용할 수 있다.

이 메서드들은 새로운 객체(복사본)를 반환하는 것이 기본값으로 설정되어 있다. 

그러나 사용자가 inplace 입력변수를 True로 설정한다면 원본데이터를 변경한다.


이 외에 경우에 따라서는 어트리뷰트에 배정하여 메타데이터를 변경할 수 있다.


메타데이터 세팅 예 1)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# index 객체 생성

In[8]: ex_index=pd.Index(['a','b','c'])


# rename 메서드의 사용 1

In[9]: ex_index.rename('name1')

Out[9]: Index(['a', 'b', 'c'], dtype='object', name='name1')

In[10]: ex_index

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


# rename 메서드의 사용 2 (inplace를 이용한 원본객체 변경)

In[11]: ex_index.rename('name1', inplace=True)

In[12]: ex_index

Out[12]: Index(['a', 'b', 'c'], dtype='object', name='name1')


# 배정을 통한 name의 변경

In[13]: ex_index.name='name2'

In[13]: ex_index

Out[13]: Index(['a', 'b', 'c'], dtype='object', name='name2')

 

set_name, levels, set_codes는 멀티인덱스에 대해 적용 가능한 level 입력변수를 가진다.


메타데이터 세팅 예 2)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# MultiIndex 객체 생성

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

In[15]: ex_multi

Out[15]: 

MultiIndex(levels=[['a0', 'a1', 'a2'], ['b0', 'b1', 'b2']],

           labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]],

           names=['a', 'b'])


# level 메서드의 사용

In[16]: ex_multi.levels[0]

Out[16]: Index(['a0', 'a1', 'a2'], dtype='object', name='a')


# set_levels 메서드의 사용 1

In[17]: ex_multi.set_levels([0,1,2], level=1)

Out[17]: 

MultiIndex(levels=[['a0', 'a1', 'a2'], [0, 1, 2]],

           labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]],

           names=['a', 'b'])

In[18]: ex_multi

Out[18]: 

MultiIndex(levels=[['a0', 'a1', 'a2'], ['b0', 'b1', 'b2']],

           labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]],

           names=['a', 'b'])


# set_levels 메서드의 사용 2 (inplace를 이용한 원본 데이터의 변경)

In[19]: ex_multi.set_levels([0,1,2], level=1, inplace=True)

In[20]: ex_multi

Out[20]: 

MultiIndex(levels=[['a0', 'a1', 'a2'], [0, 1, 2]],

           labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]],

           names=['a', 'b'])



 index 객체에 대한 집합연산과 누락값 처리


 인덱스 객체에 대한 집합 연산


집합 연산에 대한 두개의 주요 연산으로 합집합(union, |)와 교집합(intersection, &)가 있다.

  ○ 이 두 집합 연산은 메서드와 기호연산자 둘 다 사용하는 방식이 가능하다.

difference() 메서드를 통해 차집합을 계산할 수 있다. 


각 집합 메서드 및 연산자 사용 형식)

# 메서드 사용형식

object1.union(object2)

object1.intersection(object2)

object1.difference(object2)


# 연산자 사용 형식

object1 | object2

object1 & object2


object1은 연산이 수행되는 객체이다.

object2은 연산을 수행하기 위한 도구이다.

  ※ 합집합이나 교집합은 object1과 2의 순서가 큰 상관 없다.

     하지만, 차집합과 같은 경우 object1에 대해 object2의 요소들이 존재하는지 여부를 확인하고 object1에서 중복요소를 제거하므로 object1과 object2의 순서가 바뀔경우 결과가 바뀌므로 주의가 필요하다.


집합 연산의 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# index 객체 생성

In[21]: ex_index1=pd.Index(['a','b','c'])

In[22]: ex_index2=pd.Index(['b','c','d'])


# 합집합과 교집합 메서드의 사용 예제

In[23]: ex_index1.union(ex_index2)

Out[23]: Index(['a', 'b', 'c', 'd'], dtype='object')

In[24]: ex_index1.intersection(ex_index2)

Out[24]: Index(['b', 'c'], dtype='object')


# 합집합과 교집합 연산자의 사용 예제

In[25]: ex_index1 | ex_index2

Out[25]: Index(['a', 'b', 'c', 'd'], dtype='object')

In[26]: ex_index1 & ex_index2

Out[26]: Index(['b', 'c'], dtype='object')


# 차집합 메서드의 사용 예제

In[27]: ex_index1.difference(ex_index2)

Out[27]: Index(['a'], dtype='object')


또한 대칭차집합 연산도 가능한데 이는 symmetric_difference (^) 함수를 사용하면 된다.

  ○ 이 연산은 idx1 혹은 idx2에 존재하는 요소를 반환하나, 두 곳 모두에 존재하는 요소는 반환하지 않는다.

  ○ 이 메서드 결과는 idx1.difference(idx2).union(idx2.difference(idx1))에 의해 만들어지고 복사본은 삭제된 인덱스와 동일하다.


대칭차집합 메서드 및 연산자 사용 형식)

object1.symmetric_difference(object2)

object1 ^ object2


대칭차집합의 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# index 객체 생성

In[28]: ex_index1=pd.Index(['a','b','c'])

In[29]: ex_index2=pd.Index(['b','c','d'])


# 대칭차집합 메서드와 연산자의 사용

In[30]: ex_index1.symmetric_difference(ex_index2)

Out[30]: Index(['a', 'd'], dtype='object')


In[31]: ex_index1 ^ ex_index2

Out[31]: Index(['a', 'd'], dtype='object')


참고사항

  집합연산으로부터 결과로 나온 인덱스는 오름차순으로 정렬된다.


서로 다른 dtype을 가진 인덱스들 사이에서 Index.union()을 수행할때, 인덱스는 동일한 dtype을 사용하는 것이 권장된다.

항상 그런 것은 아니지만 dtype이 다를 경우 일반적으로 object dtype으로 통일된다.

예외적으로 정수(interger)와 실수(float) 데이터를 합집합을 수행할 때에는 정수값은 float으로 치환된다.


서로 다른 dtype간의 합집합 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# index 객체 생성

In[32]: ex_index1=pd.Index([0,1,2])

In[33]: ex_index2=pd.Index(['b','c','d'])


# 서로 다른 dtype 간의 합집합 예 (정수와 object)

In[34]: ex_index1.union(ex_index2)

Out[34]: Index([0, 1, 2, 'b', 'c', 'd'], dtype='object')


# 서로 다른 dtype 간의 합집합 예 (정수와 실수)

In[35]: ex_index2=pd.Index([1.2,1,3,1,4])

In[36]: ex_index1.union(ex_index2)

Out[36]: Float64Index([0.0, 1.0, 1.2, 2.0, 3.0, 4.0], dtype='float64')



 누락 값 (missing values)

Index 객체에 NaN과 같은 누락된 데이터를 가지고 있는 경우에는 예상되지 않은 상황이 발생할 수 있다.

예를들어 연산을 수행할 때 누락된 데이터를 제외해버리고 수행하는 경우도 있다.

이런 상황을 피하기위해 pandas는 누락 값을 처리하는 메서드를 제공한다. 


대표적으로 Index.fillna 메서드는 누락된 값을 명시된 값으로 채운다.


 형식)

Index.fillna(value=None)


여기서 value는 누락 값에 채울 값을 입력받으며 기본 값으로는 0으로 세팅되어 있다.


누락값 처리 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# index 객체 생성 

In[37]: ex_index=pd.Index([0,1,np.NaN,2,3,4])

In[38]: ex_index

Out[38]: Float64Index([0.0, 1.0, nan, 2.0, 3.0, 4.0], dtype='float64')


# fillna 메서드의 사용

In[39]: ex_index.fillna(1.5)

Out[39]: Float64Index([0.0, 1.0, 1.5, 2.0, 3.0, 4.0], dtype='float64')

In[40]: ex_index

Out[40]: Float64Index([0.0, 1.0, nan, 2.0, 3.0, 4.0], dtype='float64')



 

 

 

 

 참고자료

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

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

 

 

 

 



반응형

댓글