본문 바로가기
Python/Pandas

패스트 인덱싱(.at, .iat)-pandas(15)

by 콩돌 2019. 10. 24.
반응형

파이썬 버전 3.7 기준

pandas 버전 0.25.1 기준



 패스트 인덱싱(at, iat)


본 포스팅에서는 .at 및 .iat 메서드를 다루도록한다.


 .at 및 .iat 메서드


대괄호[ ]를 사용한 인덱싱은 많은 입력을 받을 수 있다. 

하지만 많은 입력을 다룰 수 있는 만큼, 많은 작업을 처리해야 해야하기 때문에 그만큼 성능을 포기해야한다.

만약 사용자가 하나의 스칼라값에만 접근하고 싶다면 .at 및 .iat 메서드를 사용하여 성능을 개선할 수 있다.


.at 및 .iat 메서드들은 하나의 스칼라 값에만 접근하는데 특화되어 있는 메서드들이다.

이 메서드들의 사용법은 .loc 및 .iloc 메서드에서 하나의 스칼라 값에 접근하는 방법과 동일하다.

이 메서드들은 Series와 DataFrame 둘 다 적용이 가능하다. 

 .at 메서드

.at 메서드는 .loc메서드와 동일하게 레이블(label)기반으로 데이터에 접근하는 메서드이다. 

단, 위에서 설명했다시피 하나의 스칼라 값에만 접근이 가능하다.

.at 메서드에 대한 기본적인 구문 형식은 다음과 같다.


.at 메서드의 기본적인 구문 형식)

# Series에서의 사용

  Series.at[ 'index_label' ]  

# DataFrame에서의 사용

  DataFrame.at[ 'index_label', 'column_label'  ]


'index_label'은 행을 선택하기 위한 인덱스의 레이블을 의미한다.

'column_label'은 행 선택 이후 해당 행에서 요소를 선택하기 위한 열의 레이블을 의미한다.


.at 메서드 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언 

In[5]: ex_s=pd.Series([0,1,2,3,4,5,6,7,8], index=['r0','r1','r2','r3','r4','r5','r6','r7','r8'])

In[6]: ex_df=pd.DataFrame([[0,1,2],[3,4,5],[6,7,8]], index=['r0','r1','r2'], columns=['c0','c1','c2'])


# Series에서의 사용 

In[7]: ex_s.at['r2']

Out[7]: 2


# DataFrame에서의 사용 

In[8]: ex_df.at['r2','c1']

Out[8]: 7


 .iat 메서드

.iat 메서드는 .iloc메서드와 동일하게 위치 정수로 데이터에 접근하는 메서드이다. 

단, 위에서 설명했다시피 하나의 스칼라 값에만 접근이 가능하다.

.iat 메서드에 대한 기본적인 구문 형식은 다음과 같다.


.iat 메서드의 기본적인 구문 형식)

# Series에서의 사용

  Series.iat[ index_int ]  

# DataFrame에서의 사용

  DataFrame.iat[ index_int, column_int  ]


index_int은 행을 선택하기 위한 인덱스의 위치 정수를 의미한다.

column_int은 행 선택 이후 해당 행에서 요소를 선택하기 위한 열의 위치 정수를 의미한다.


iat 메서드 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언 

In[5]: ex_s=pd.Series([0,1,2,3,4,5,6,7,8], index=['r0','r1','r2','r3','r4','r5','r6','r7','r8'])

In[6]: ex_df=pd.DataFrame([[0,1,2],[3,4,5],[6,7,8]], index=['r0','r1','r2'], columns=['c0','c1','c2'])


# Series에서의 사용 

In[9]: ex_s.iat[4]

Out[9]: 4


# DataFrame에서의 사용 

In[10]: ex_df.iat[1,2]

Out[10]: 5



 .at 및 .iat 메서드와 .loc 및 .iloc 메서드간의 성능비교 


아래 예제 스크립트는 성능비교를 위한 예제이다.

각 메서드의 성능만을 보기위해 이중 for문을 사용하여 gg라는 임의의 변수에 각 메서드로 선택한 값을 반복해서 배정시키는 작업을 반복시켰다. 

시간을 측정하기 위해서 time 모듈의 time() 함수를 사용하였다.

  ○ 작업 시작전 time.time() 함수를 통해 ex_start_time에 시간을 저장시키고, 작업이 마무리된 후 time.time() 함수를 통해 ex_end_time에 끝나는 시간을 저장시킨 후 두 값을 빼서 작업한 시간을 계산하였다.


성능 비교를 위한 스크립트 예제) at_speed.py

# 필요 모듈의 import

import numpy as np

import pandas as pd

import time


# 예제 배열 선언

ex_df=pd.DataFrame(np.random.rand(1000,1000))


# iloc 메서드를 활용한 반복 배정

gg=0

ex_start_time=time.time()

for x in range(1000):

    for y in range(1000):

        gg=ex_df.iloc[x,y]

ex_end_time=time.time()

print('iloc method spend ', ex_end_time-ex_start_time, ' s')


# iat 메서드를 활용한 반복 배정

gg=0

ex_start_time=time.time()

for x in range(1000):

    for y in range(1000):

        gg=ex_df.iat[x,y]

ex_end_time=time.time()

print('iat method spend ', ex_end_time-ex_start_time, ' s')


위의 예제 스크립트를 실행 시켰을 때의 결과는 다음과 같다.

컴퓨터 성능에 따라 계산 시간은 달라지겠지만 포스팅 작성자의 컴퓨터에서는 아래와 같은 결과를 얻었다.

  ○ iloc 메서드를 사용하였을지 작업시간은 약 8.10초 였다.

  ○ iat 메서드를 사용하였을 시 작업시간은 약 5.32초 였다.

  ○ iat 메서드가 iloc 메서드에 비해 약 1.5배정도 빠른 것을 확인할 수 있다.


위의 스크립트를 실행한 결과)

iloc method spend  8.103702306747437  s

iat method spend  5.329110383987427  s




 

 

 

 

 참고자료

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

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

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

 

 

 

 



반응형

댓글