본문 바로가기
Python/Pandas

데이터의 열의 빠른 추출, take() 메서드-pandas(45)

by 콩돌 2020. 12. 28.
반응형

파이썬 버전 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

 

 

 

 

 

반응형

댓글