본문 바로가기
Python/Pandas

구간 인덱스 타입(IntervalIndex)과 구간인덱스 생성-pandas(48)

by 콩돌 2021. 1. 5.
반응형

파이썬 버전 3.8 기준

pandas 버전 1.2.0 기준


 구간 인덱스 타입(IntervalIndex)과 구간인덱스 생성


본 포스팅에서는 Pandas에서 제공하는 구간인덱스인 IntervalIndex에 대해 다루도록 한다.

또한 구간인덱스를 생성하기 위한 interval_range()함수에 대해서도 설명을 하도록 한다.

 

 

 IntervalIndex과 인덱싱

 

IntervalIndex는 구간인덱스로, 특정 숫자 구간에 대한 값들을 저장할 때 사용한다.

pandas에서는 Interval에 대한 표기법에 대해서 지원되며, 이는 InterValIndex와 하부 dtype을 포함한다.

  

IntervalIndex는 몇몇의 독특한 인덱싱을 할 수 있게하며, 또한 cut()과 qcut()에서 카테고리에 대한 자료형을 반환하는데 사용한다.

  ○ cut()과 qcut() 메서드에 대한 설명은 여기(링크)를 참고한다.

 

 

 IntervalIndexing을 사용한 인덱싱

IntervalIndex는 Series와 DataFrame에서 인덱스로 사용될 수 있다.

예제를 수행하기 위해 다음과 같이 기본적인 세팅을 수행한다.


모듈의 임폴트 및 예제용 Series 생성)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


In[4]: ex_df = pd.DataFrame([1,2,3,4], index=pd.IntervalIndex.from_breaks([0,1,2,3,4]), columns=['A'])

In[5]: ex_df

Out[5]: 

        A

(0, 1]  1

(1, 2]  2

(2, 3]  3

(3, 4]  4

 

 

interval의 끝 값을 따라서 .loc를 통한 레이블 기반의 인덱싱은 다음과 같이 작동한다. 

  ○ 특정 interval을 선택할 수 있다.

  ○ 만약 사용자가 interval안에 담겨진 레이블을 선택한다면, 이것은 또한 interval도 선택을 한다.

 

구간인덱스에 대한 인덱싱 예제)

# 인덱스 구간의 끝값 입력

In[6]: ex_df.loc[2]

Out[6]: 

A    2

Name: (1, 2], dtype: int64


# 인덱스 구간 안의 한 값의 입력

In[7]: ex_df.loc[1.5]

Out[7]: 

A    2

Name: (1, 2], dtype: int64


# 다수의 값 입력

In[8]: ex_df.loc[ [ 1, 2, 3.5 ] ]

Out[8]: 

        A

(0, 1]  1

(1, 2]  2

(3, 4]  4

 

 

interval을 사용하여 데이터를 선택할 경우 정확히 매치되어야 한다.

IntervalIndex에 정확히 매치되지 않은 interval을 선택하는 것을 시도하는 것은 KeyError를 발생시킨다.


정확한 구간을 이용한 인덱싱)

# 정확히 구간이 매치된 인덱싱

In[9]: ex_df.loc[ pd.Interval(3, 4) ]

Out[9]: 

A    4

Name: (3, 4], dtype: int64


# 정확히 구간이 매치되지 않을 경우

In[10]: ex_df.loc[pd.Interval(2.5,3.5)]

KeyError: Interval(2.5, 3.5, closed='right')

 

 

특정 구간에 겹치는 모든 Interval을 선택하고 싶은 경우 overlabs() 메서드를 사용하면 된다.

이는 주어진 Interval을 덮어쓰는 모든 Interval을 선택하여, 불린인덱스를 출력한다.

해당 불린인덱스를 이용하여 인덱싱을 수행할 수 있다.

그외에 슬라이싱을 사용할 경우 위 방법과 유사하게 인덱싱이 된다.

 

overlabs메서드 사용)

# overlabs () 메서드 사용 예제

In[11]: ex_index = ex_df.index.overlaps(pd.Interval(1.5, 3.5))

In[12]: ex_index

Out[12]: array([False,  True,  True,  True])


# [ ] 를 통한 인덱싱 예제

In[13]: ex_df[ex_index]

Out[13]: 

        A

(1, 2]  2

(2, 3]  3

(3, 4]  4


# .loc 를 통한 인덱싱 예제

In[14]: ex_df.loc[ex_index]

Out[14]: 

        A

(1, 2]  2

(2, 3]  3

(3, 4]  4


# 슬라이싱을 통한 인덱싱 예제

In[15]: ex_df.loc[1.5:3.5]

Out[15]: 

        A

(1, 2]  2

(2, 3]  3

(3, 4]  4

 

 

 

 IntervalIndex의 생성

 

 

 interval 범위의 생성 

만약에 사용자가 일정한 주기를 가지는 interval이 필요할 경우, 사용자는 interval_range() 함수를 사용할 수 있다.

  ○ 이 함수는 start, end, periods 등을 다양하게 조합하여 intervalIndex를 만들 수 있다.

기본적으로 interval_range() 함수에서 periods는 기본값으로 1이 들어가있고, 시간과 같은 interval에서는 달력 일이 기본값으로 들어가있다.


interval_range() 함수를 사용한 IntervalIndex 생성 예제)

# 정수 interval 생성 예제

In[16]: pd.interval_range(start=0, end =7)

Out[16]: 

IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4], (4, 5], (5, 6], (6, 7]],

              closed='right',

              dtype='interval[int64]')


# 날짜 interval 생성 예제 1

In[17]: d.interval_range(start=pd.Timestamp("2017-01-01"), periods=7)

Out[17]: 

IntervalIndex([(2017-01-01, 2017-01-02], (2017-01-02, 2017-01-03], (2017-01-03, 2017-01-04], (2017-01-04, 2017-01-05], (2017-01-05, 2017-01-06], (2017-01-06, 2017-01-07], (2017-01-07, 2017-01-08]],

              closed='right',

              dtype='interval[datetime64[ns]]')


# 날짜 interval 생성 예제 2

In[18]: pd.interval_range(end=pd.Timedelta("3 days"), periods=7)

Out[18]: 

IntervalIndex([(-4 days +00:00:00, -3 days +00:00:00], (-3 days +00:00:00, -2 days +00:00:00], (-2 days +00:00:00, -1 days +00:00:00], (-1 days +00:00:00, 0 days 00:00:00], (0 days 00:00:00, 1 days 00:00:00], (1 days 00:00:00, 2 days 00:00:00], (2 days 00:00:00, 3 days 00:00:00]],

              closed='right',

              dtype='interval[timedelta64[ns]]')

 

 

freq 파라미터는 기본값이 아닌 주기를 명시할 때 사용될 수 있다. 

그리고 시간 인터벌에서는 다양한 주기를 활용할 수 있다.

 

freq 입력변수 사용 예제)

# freq 사용 예제 (정수)

In[19]: pd.interval_range(start=0, periods=14, freq=0.5)

Out[19]: 

IntervalIndex([(0.0, 0.5], (0.5, 1.0], (1.0, 1.5], (1.5, 2.0], (2.0, 2.5] ... (4.5, 5.0], (5.0, 5.5], (5.5, 6.0], (6.0, 6.5], (6.5, 7.0]],

              closed='right',

              dtype='interval[float64]')


# freq 사용 예제 (날짜 1)

In[20]: pd.interval_range(start=pd.Timestamp("2017-01-01"), periods=7, freq="w")

Out[20]: 

IntervalIndex([(2017-01-01, 2017-01-08], (2017-01-08, 2017-01-15], (2017-01-15, 2017-01-22], (2017-01-22, 2017-01-29], (2017-01-29, 2017-02-05], (2017-02-05, 2017-02-12], (2017-02-12, 2017-02-19]],

              closed='right',

              dtype='interval[datetime64[ns]]')


# freq 사용 예제 (날짜 2)

In[21]: pd.interval_range(end=pd.Timedelta("3 days"), periods=7, freq="8h")

Out[21]: 

IntervalIndex([(0 days 16:00:00, 1 days 00:00:00], (1 days 00:00:00, 1 days 08:00:00], (1 days 08:00:00, 1 days 16:00:00], (1 days 16:00:00, 2 days 00:00:00], (2 days 00:00:00, 2 days 08:00:00], (2 days 08:00:00, 2 days 16:00:00], (2 days 16:00:00, 3 days 00:00:00]],

              closed='right',

              dtype='interval[timedelta64[ns]]')

 

 

추가적으로, closed 파라미터는 좌 우중 닫는 부분을 명시할 때 사용될 수 있다.

기본값으로는 오른쪽을 닫도록 설정되어 있다.

  ○ 'right': 오른쪽 닫힘 (기본값)

  ○ 'left': 왼쪽 닫힘  

  ○ 'both': 양쪽 닫힘 

  ○ 'neither': 양쪽 열림 


closed 입력변수 사용 예제)

# closed 입력변수 사용 예제 1

In[22]: pd.interval_range(start=0, end=7, closed="both")

Out[22]: 

IntervalIndex([[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7]],

              closed='both',

              dtype='interval[int64]')


# closed 입력변수 사용 예제 2

In[23]: pd.interval_range(start=0, end=7, closed="neither")

Out[23]: 

IntervalIndex([(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7)],

              closed='neither',

              dtype='interval[int64]')

 

 

start, end, periods를 명시하는 것은 균등하게 나뉘어진 인터벌의 range를 작성한다.

  ○ start: 시작지점

  ○ end: 끝지점 

  ○ periods: 나뉘는 요소의 수 


start, end, periods 입력변수 사용 예제)

In[24]: pd.interval_range(start=0, end=4, periods=8)

Out[24]: 

IntervalIndex([(0.0, 0.5], (0.5, 1.0], (1.0, 1.5], (1.5, 2.0], (2.0, 2.5], (2.5, 3.0], (3.0, 3.5], (3.5, 4.0]],

              closed='right',

              dtype='interval[float64]')

 

 

 

 

 

 

 

 참고자료

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

  

 

 

 

 

 

 

반응형

댓글