Python/Pandas

[Pandas] 데이터프레임 인덱싱 loc, at 차이(iloc, iat 차이)

jimmy_AI 2021. 11. 5. 21:00
반응형

이번 포스팅에서는 pandas 내 데이터프레임에서 인덱싱을 하는 loc, at과 iloc, iat 함수의 차이를 분석해보도록 하겠습니다.

데이터 프레임으로는 kaggle의 타이타닉 데이터셋을 활용하여 예시를 들어보도록 하겠습니다.

loc, at 분석

이 두 함수에서 인덱싱을 하는 여러 경우에 대하여 가능 여부를 살펴보도록 하겠습니다.

1) 단일 데이터 인덱싱

예를 들어, 'Pclass' 열의 100번 인덱스를 가지는 행의 값을 찾는 경우 두 함수 모두 정상 작동하는 것을 확인할 수 있습니다.

 

2) 한 column 내 범위 인덱싱

예를 들어, 'Pclass' 열의 100~102번 인덱스를 가지는 행들의 값을 찾는 경우 loc 함수는 정상 작동되지만, at 함수는 지원하지 않는 기능이라 ValueError가 등장하는 것을 확인하실 수 있습니다.

 

3) 한 row 내 여러 column 인덱싱

100번 인덱스를 가지는 행의 'Pclass'와 'Age' 열의 을 찾는 경우 loc 함수는 정상 작동되지만, at 함수는 지원하지 않는 기능이라 TypeError가 등장하는 것을 확인하실 수 있습니다.

 

4) 여러 row, 여러 column 인덱싱

100~102번 인덱스를 가지는 행들의 'Pclass'와 'Age' 열의  을 찾는 경우 loc 함수는 정상 작동되지만, at 함수는 지원하지 않는 기능이라 ValueError가 등장하는 것을 확인하실 수 있습니다.

 

5) 단일 인덱싱 수행 시간 비교

단일 인덱싱을 10만회씩 수행하여 소요된 시간을 비교해보았습니다. at함수가 loc함수에 비해 2배 가량 빠른 속도를 보였습니다. 이 차이는 CPU 환경이나 데이터프레임 크기에 따라 달라질 수는 있지만, at함수가 단일 인덱싱에서는 확실히 좋은 성능을 보이는 듯 합니다.

 

참고로, df.at[100, 'Pclass'] = 2 이런식으로 인덱싱된 위치에 새로운 값을 할당하는 기능도 수행이 가능합니다.

 

iloc과 iat에서도 위와 마찬가지로 단일 인덱싱에서 iat이 더 빠른 속도를 보이며, 여러 row/column을 인덱싱할 때는 iat은 지원하지 않는 상황은 동일합니다.(단, iat이 3번 경우에서는 TypeError가 아닌 ValueError가 호출됩니다.)

 

요약하면, 단일 인덱싱에서는 at, iat이 작업 시간 상 유리하고, 여러 row/column을 인덱싱해야하는 상황에서는 loc, iloc을 사용해야만 한다는 것입니다.