Pandas loc & iloc
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 |
댓글남기기