본문 바로가기
Daily Review

Python에서 루프와 함께 loc/iloc을 사용하지 말고 대신 이것을 사용하십시오!

by data-analyst-luke 2022. 9. 8.
반응형

60배 빠른 속도로 루프 실행

 

Unsplash

 

최근에 나는 파이썬에서 루프를 실험하고 있었고 루프 내에서 'iloc'/ 'loc'을 사용하는 것이 실행하는 데 많은 시간이 걸린다는 것을 깨달았습니다. 즉각적인 다음 질문은 'loc'이 너무 많은 시간을 소요하는 이유와 'loc'의 대안이 무엇입니까?

이 블로그에서는 몇 가지 실용적인 예를 살펴봄으로써 이러한 질문에 답할 것입니다.

 

loc이란 무엇입니까 - 아직 모르는 경우!

loc[] 함수는 행 인덱스와 열 이름을 사용하여 DataFrame 내의 값에 액세스하는 데 사용되는 pandas 함수입니다. 액세스하려는 행과 열을 알고 있을 때 사용됩니다.

예제를 사용하여 loc을 이해합시다. df(아래 표시)라는 이름의 다음 pandas DataFrame이 있고 'a' 열의 두 번째 행, 즉 10에 해당하는 값에 액세스하려고 합니다.

 

 

다음 코드를 사용하여 값에 액세스할 수 있습니다.

##df.loc[인덱스, 컬럼명]
df.loc[1,'a']
### 출력: 10

 

마찬가지로 iloc은 인덱스와 열 번호를 사용하여 값에 액세스하는 데 사용됩니다.

##df.loc[인덱스, 컬럼 번호]
df.iloc[1,0]
### 출력: 10

 

따라서 loc 함수 는 열 이름 을 사용하여 열에 액세스하는 데 사용되는 반면 iloc 함수 는 열 인덱스 를 사용하여 열에 액세스하는 데 사용 됩니다 .

 

Python에서 루프와 함께 loc/iloc을 사용하면 어떻게 됩니까?

DataFrame df에 열 'a'와 열 'b' 값의 합과 같은 새 열 'c'를 추가한다고 상상해 보십시오.

'for' 루프를 사용하여 DataFrame을 반복하고 아래와 같이 loc 함수를 사용하여 새 열 'c'를 추가할 수 있습니다.

import time
start = time.time()
# Iterating through the DataFrame df
for index, row in df.iterrows():
        df.loc[index,'c'] = row.a + row.b
end = time.time()
print(end - start)
### Time taken: 2414 seconds

 

loc을 사용하여 값을 반복하고 업데이트하는 데 걸리는 시간은 약 40분 으로 많은 시간입니다.

 

대안: 'loc' 대신 'at' 사용

아래와 같이 'loc'을 'at'으로 대체(또는 'iloc'을 'iat'로 대체)하여 동일한 조작을 수행할 수 있습니다.

import time
start = time.time()
# Iterating through DataFrame 
for index, row in df.iterrows():
    df.at[index,'c'] = row.a + row.b
end = time.time()
print(end - start)
### Time taken: 40 seconds

 

코드는 ~ 0.7분 안에 실행되며 이는 loc 함수에 소요되는 시간에 비해 60배 더 빠릅니다 .

 

'loc' vs 'at' 의 차이점은 무엇입니까?

  • ‘at’/ ‘iat’

DataFrame의 단일 요소인 스칼라에 액세스하기 위한 것입니다.

df.at[2,'a']
### Output: 22
df.iat[2,0]
### Output: 22

 

여러 개에 액세스하려고 하면 아래와 같이 오류가 발생합니다.

## This will give an error as we are trying to access multiple rows
df.at[:3,'a']
### Output: ValueError: At based indexing on an integer index can only have integer indexers

 

  • 'loc'/ 'iloc'

loc잠재적 으로 iloc벡터화된 작업을 수행하기 위해 여러 요소(시리즈/데이터 프레임)에 동시에 액세스하기 위한 것입니다.

df.loc[:3,'a']
### Output
##0    26
##1    10
##2    22
##3    22
df.loc[:3,0]
### Output
##0    26
##1    10
##2    22
##3    22

 

at는 scaler 값에 접근하는 데 사용되므로 시리즈/datafame에 액세스하는 데 사용되는 것(loc)에 비해 가볍고(구현이 빠름) 더 많은 공간과 시간이 걸립니다.

 

결론

파이썬의 루프 내에서 'loc'/'iloc'을 사용하는 것은 최적이 아니며 피해야 합니다. 대신 'loc' / 'iloc'에 비해 훨씬 빠르기 때문에 필요할 때마다 'at' / 'iat'를 사용해야 합니다.

 

또한 'loc'/'iloc'은 벡터화된 연산을 적용할 때 파이썬의 루프 '외부'에서 놀라울 정도로 잘 작동한다는 점을 명심하십시오.

 

반응형

댓글