2 분 소요

loc 와 iloc의 차이

DataFrame 에서 데이터를 추출할 때에 많이 사용 하는 loc, 와 iloc의 차이를 학습하여 적재적소에 사용하여 보자.



한줄로 두 방식의 차이를 표현하면 다음과 같다.

  • loc : index, column 아무것이나 사용 가능
  • iloc : 행의 번호만 사용 가능


코드를 통해 각 방식을 사용해보면서 차이를 알아보자.

import pandas as pd
import numpy as np

list1 = ['정호','노제','노제','윈터','정호','노제','윈터','정호','노제','윈터','정호']
list2 = ['11/25','11/25','11/25','11/25','11/26','11/27','11/27','11/28','11/28','11/28','11/29']
list3 = ['아이폰','갤럭시','갤럭시','에어팟','에어팟','갤럭시','에어팟','아이폰','갤럭시','아이폰','에어팟']
list4 = [1,2,1,3,2,1,1,2,4,3,4]
df= pd.DataFrame({'판매원' : list1 , '판매날짜':list2 , '판매물품':list3, '판매개수':list4 })

df.index = [1,2,3,4,5,6,7,8,9,10,11]

df
판매원 판매날짜 판매물품 판매개수
1 정호 11/25 아이폰 1
2 노제 11/25 갤럭시 2
3 노제 11/25 갤럭시 1
4 윈터 11/25 에어팟 3
5 정호 11/26 에어팟 2
6 노제 11/27 갤럭시 1
7 윈터 11/27 에어팟 1
8 정호 11/28 아이폰 2
9 노제 11/28 갤럭시 4
10 윈터 11/28 아이폰 3
11 정호 11/29 에어팟 4

데이터를 새로 만들기 귀찮아서 crosstab을 공부할 때 만들었던 데이터셋을 재사용하겠다.
차이점을 보여주기 위해 index를 0이 아닐 1부터 시작하도록 변경하였다.

index 에서 나타나는 차이점

loc 와 iloc 둘 다 [행][열] 의 순서로 필터링을 할 수 있다.

df.loc[3][2]
'갤럭시'
df.iloc[3][2]
'에어팟'

결과를 통해 알 수 있듯이 똑같은 인덱스를 참고하였지만 다른 결과값을 추출해준다.

loc 의 경우 dataframe 내의 사용자가 정한 index 값을 참조한다.
만약 인덱스를 ‘하나 둘 셋 넷’ 이런식의 문자열로 설정하였다면 loc를 사용할 때에 행을 인덱싱 하기 위해선 loc[‘셋’][2] 의 형식으로 사용하여야 한다.

iloc 는 사용자가 정한 인덱스와 무관하게 데이터의 물리적인 index 순서를 참고한다.

df.loc[8:]
판매원 판매날짜 판매물품 판매개수
8 정호 11/28 아이폰 2
9 노제 11/28 갤럭시 4
10 윈터 11/28 아이폰 3
11 정호 11/29 에어팟 4
df.iloc[8:]
판매원 판매날짜 판매물품 판매개수
9 노제 11/28 갤럭시 4
10 윈터 11/28 아이폰 3
11 정호 11/29 에어팟 4

슬라이싱을 이용한 행의 추출에서도 차이를 확인 할 수 있다.


column 추출 방법의 차이


dataframe에서 특정 열만 추출한다고 가정해보자.

df.loc[8:]['판매날짜']
8     11/28
9     11/28
10    11/28
11    11/29
Name: 판매날짜, dtype: object

loc 에서는 칼럼명을 이용하여 해당 열을 추출할 수 있지만 iloc에서 사용하게 되면 오류가 난다.
iloc는 데이터 상의 이름이 아닌 오직 index number 로만 사용이 가능하다.

df.loc[8:,['판매원','판매물품']]
판매원 판매물품
8 정호 아이폰
9 노제 갤럭시
10 윈터 아이폰
11 정호 에어팟
df.iloc[7:,[0,2]]
판매원 판매물품
8 정호 아이폰
9 노제 갤럭시
10 윈터 아이폰
11 정호 에어팟

보다시피 동일한 값을 찾지만 입력하는 방식은 다르다.

구체적인 사용법을 통한 비교

loc와 iloc를 둘 다 사용하여 동일한 값을 다양한 방법으로 추출해보자.

단일 값 추출


df.loc[1][2]
'아이폰'
df.iloc[0,2]
'아이폰'

iloc는 [행,열] 의 형식으로 데이터를 추출할 수 있지만 loc는 불가능하다.

리스트를 이용해 dataframe 형식으로 추출


df.loc[1:5,['판매원','판매물품']]
판매원 판매물품
1 정호 아이폰
2 노제 갤럭시
3 노제 갤럭시
4 윈터 에어팟
5 정호 에어팟
df.iloc[0:5,[0,2]]
판매원 판매물품
1 정호 아이폰
2 노제 갤럭시
3 노제 갤럭시
4 윈터 에어팟
5 정호 에어팟

boolean 을 통한 추출

df.loc[1:3,[True,True,False,True]]
판매원 판매날짜 판매개수
1 정호 11/25 1
2 노제 11/25 2
3 노제 11/25 1
4 윈터 11/25 3
5 정호 11/26 2
df.iloc[0:3,[True,True,False,True]]
판매원 판매날짜 판매개수
1 정호 11/25 1
2 노제 11/25 2
3 노제 11/25 1

댓글남기기