파이썬 버전 3.8 기준
pandas 버전 1.2.0 기준
데이터의 열의 빠른 반환, take() 메서드 |
본 포스팅에서는 take메서드를 다루도록 한다.
take 메서드는 데이터의 행이나 열을 추출할 때 iloc 메서드보다 좀 더 빠른 성능을 기대할 수 있다.
take() 메서드 |
Numpy의 ndarrays와 유사하게 pandas의 인덱스, Series, DataFrame은 또한 take() 메서드를 제공한다.
take() 메서드는 입력된 축과 정수 인덱스에 해당하는 요소들을 반환한다.
take() 메서드에 대한 특징으로는 다음과 같다.
○ 주어진 인덱스들은 반드시 정수의 인덱스 위치로 이루어진 ndarray나 리스트이어야 한다.
○ take() 메서드는 또한 음수의 정수도 사용할 수 있다.
○ .iloc 메서드로 같은 작업을 수행할 수 있다.
▷ 하지만 .iloc 메서드보다 더 빠르기 때문에 최적화에 적합하다.
▷ take() 메서드는 iloc 메서드와 마찬가지로 정수 기반의 위치인덱스를 사용하기 때문에, 멀티인덱스가 적용되지 않는다.
take() 메서드의 사용 형식은 다음과 같다.
메서드 사용 형식)
result=object.take(indices, axis=0)
각 입력 객체별 설명은 다음과 같다.
○ object: 메서드가 적용되는 객체로 DataFrame, Series 등이 해당된다.
○ axis: 메서드를 적용할 축을 입력받는다.
▷ 0 or 'index': 행의 인덱스를 정렬한다.(기본값)
▷ 1 or 'columns': 열의 인덱스를 정렬한다.
take() 메서드 사용 예제 |
예제를 수행하기에 앞서 다음과 같이 모듈의 import와 DataFrame을 정의한다.
모듈의 임폴트 및 예제용 DataFrame의 정의)
# pandas와 numpy의 import
In[2]: import pandas as pd
In[3]: import numpy as np
In[4]: ex_df=pd.DataFrame([range(x*4,x*4+4) for x in range(4)])
DataFrame에 대해서 주어진 인덱스는 반드시 1D 리스트나 ndarray어야한다.
○ 해당 배열들은 행 혹은 열의 위치를 명시하는 정수들로 구성되어야 한다.
아래 예제는 take 메서드를 적용하는 예를 보여준다.
take 메서드의 사용 예제)
# take 메서드 사용 예제
In[5]: ex_df.take([1,3])
Out[5]:
0 1 2 3
1 4 5 6 7
3 12 13 14 15
# iloc 메서드를 사용할 경우
In[6]: ex_df.iloc[[1,3]]
Out[6]:
0 1 2 3
1 4 5 6 7
3 12 13 14 15
axis를 이용하여 데이터를 추출할 축을 선택할 수 있다.
○ axis=0: row를 선택한다.(기본값)
○ axis=1: column를 선택한다.
axis 입력변수의 사용 예제)
# axis 입력변수 사용 예제
In[7]: ex_df.take([1,3], axis=1)
Out[7]:
1 3
0 1 3
1 5 7
2 9 11
3 13 15
# iloc 메서드를 사용할 경우
In[8]: ex_df.iloc(axis=1)[[1,3]]
Out[8]:
1 3
0 1 3
1 5 7
2 9 11
3 13 15
pandas 객체에서 take() 메서드는 불린인덱스(boolean index)를 적용할 수 없다.
○ False는 0으로 True는 1이란 정수로 인식한다.
boolean index를 사용할 수 없음을 보여주는 예제)
# 불린인덱스를 시도하는 안좋은 예제
In[9]: ex_df.take([True, False])
Out[9]:
0 1 2 3
1 4 5 6 7
0 0 1 2 3
take() 메서드는 입력의 좁은 범위를 다루기때문에, 이것은 다른 인덱싱 메서드에 비해 빠른 성능을 가진다.
take 메서드의 속도)
# 속도 측정용 DataFrame과 indexer의 정의
In[10]: ex_df2 = pd.DataFrame(np.arange(1000*1000).reshape(1000,1000))
In[11]: indexer = np.arange(1000)
# row에 대한 추출 속도 비교
In[12]: %timeit ex_df2.iloc[indexer]
1.76 ms ± 57.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In[13]: %timeit ex_df2.take(indexer)
1.65 ms ± 23.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
# columns에 대한 추출 속도 비교
In[14]: %timeit ex_df2[indexer]
2.77 ms ± 67.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In[15]: %timeit ex_df2.take(indexer, axis=1)
2.56 ms ± 40.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
메서드 세부사항 |
DataFrame.take(self, indices, axis=0, is_copy=True, **kwargs) |
축을따라 주어진 위치상의 인덱스들의 안에 요소들을 반환한다.
이는 객체의 인덱스 어트리뷰트 안에 실제 값을 따라 인덱싱하는 것이 아님을 의미한다.
이는 객체안의 요소의 실제 위치에 따라 인덱싱하는 것이다.
indices: array-like
가져올 위치를 나타내는 정수의 배열이다.
axis: {0 or 'index', 1 or 'columns'},
기본값은 0이다.
요소를 선택하기 위한 축을 입력받는다.
0은 행을 선택하는 것을 의미한다.
1은 열을 선택하는 것을 의미한다.
is_copy: bool
기본값은 True이다.
기존 객체의 복사본을 반환할지 여부를 결정한다.
**kwargs
출력에는 영향을 미치지 않는다.
자세한 사항은 numpy.take() 설명을 보자.
|
|
|
| 참고자료 https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.take.html |
|
|
|
|
'Python > Pandas' 카테고리의 다른 글
숫자형 인덱스(Index)타입(Int64Index, Float64Index)-pandas(47) (0) | 2021.01.04 |
---|---|
멀티인덱스와 인덱스 정렬, sort_index()메서드-pandas(46) (0) | 2020.12.29 |
멀티인덱스의 슬라이스(slice)와 단면(cross-section)추출-pandas(44) (0) | 2020.12.27 |
멀티인덱스(MultiIndex)의 인덱싱(indexing)-pandas(43) (0) | 2020.11.08 |
멀티인덱스 레이블의 추출과 비사용 level의 제거-pandas(42) (0) | 2020.11.05 |
댓글