파이썬 버전 3.7 기준
pandas 버전 0.25.1 기준
패스트 인덱싱(at, iat) |
본 포스팅에서는 .at 및 .iat 메서드를 다루도록한다.
.at 및 .iat 메서드 |
대괄호[ ]를 사용한 인덱싱은 많은 입력을 받을 수 있다.
하지만 많은 입력을 다룰 수 있는 만큼, 많은 작업을 처리해야 해야하기 때문에 그만큼 성능을 포기해야한다.
만약 사용자가 하나의 스칼라값에만 접근하고 싶다면 .at 및 .iat 메서드를 사용하여 성능을 개선할 수 있다.
.at 및 .iat 메서드들은 하나의 스칼라 값에만 접근하는데 특화되어 있는 메서드들이다.
이 메서드들의 사용법은 .loc 및 .iloc 메서드에서 하나의 스칼라 값에 접근하는 방법과 동일하다.
.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
'Python > Pandas' 카테고리의 다른 글
where 및 mask 메서드 옵션, 설명, 사용 예-pandas(17) (0) | 2019.10.28 |
---|---|
isin 메서드 옵션 및 설명과 인덱싱-pandas(16) (0) | 2019.10.26 |
불린 배열(boolean array)을 이용한 인덱싱-pandas(14) (0) | 2019.10.23 |
.ix 메서드를 이용한 인덱싱-pandas(13) (0) | 2019.10.22 |
.iloc 메서드(정수 위치)를 이용한 인덱싱과 슬라이싱-pandas(12) (0) | 2019.10.21 |
댓글