파이썬 버전 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
|
|
|
|
|
'Python > Pandas' 카테고리의 다른 글
카테고리 인덱스(CategoricalIndex) 기반 중복인덱싱-pandas(49) (4) | 2021.01.06 |
---|---|
숫자형 인덱스(Index)타입(Int64Index, Float64Index)-pandas(47) (0) | 2021.01.04 |
멀티인덱스와 인덱스 정렬, sort_index()메서드-pandas(46) (0) | 2020.12.29 |
데이터의 열의 빠른 추출, take() 메서드-pandas(45) (0) | 2020.12.28 |
멀티인덱스의 슬라이스(slice)와 단면(cross-section)추출-pandas(44) (0) | 2020.12.27 |
댓글