본문 바로가기
Python/Pandas

Data Frame의 행, 열 선택하기: iloc과 loc의 차이점

by 모두의 케빈 2022. 11. 7.

안녕하세요. 모두의 케빈입니다.

오늘은 Dafa Frame의 행, 열을 선택하는 방법 중 대표적인 loc과 iloc에 대해 알아보도록 하겠습니다.

 

 

■ iloc과 loc이란? 정의와 차이점

 

순서 기반 접근 vs 명시된 이름으로 접근

pandas 공식 페이지에 의하면, iloc은 정수 "위치" 기반 인덱싱이라고 나와있습니다. iloc은 integer location의 약자로, 행과 열의 위치, 즉 순서 정보로 data frame에 접근합니다.

반면 loc은 "레이블" 등으로 행과 열에 접근한다고 나와있습니다. 행과 열의 "이름"으로 접근한다고 접근한다고 생각하시면 편합니다.

 

 

 

 

 

위 테이블을 예시로 설명드리겠습니다. iloc은 순서 기반 인덱싱이라고 했습니다. 따라서 "두 번째 행, 세 번째 열의 정보를 가져와줘"의 방식으로 Data Frame에 접근하며 호출되는 Cell 값은 "과장"입니다.

loc은 이름 기반 인덱싱이라고 했습니다. 그래서 "2번(index)의 이름을 가진 행, 직급 열의 정보를 가져워줘" 방식으로 접근하며 호출되는 Cell 값은 "대리"입니다.

일반적으로 iloc은 컴퓨터가 이해하기 쉬운 접근 방법이며, loc은 사람이 이해하기 쉬운 접근 방법이라고 알려져 있습니다. 자 그러면, 본격적으로 코드를 통해 보다 상세한 사용법에 대해 알아보도록 하겠습니다.

 

■ iloc: 위치, 순서 기반 인덱싱

 

먼저 앞선 글에서 생성한 데이터 프레임을 호출해보도록 하겠습니다.

import pandas as pd

df = pd.read_excel("employee_list.xlsx")
df

 

 

 

 

이제 본격적으로 iloc의 활용법에 대해 실습해보도록 하겠습니다. 먼저 Cell 값을 추출하는 방법입니다. 이미숙이라는 Cell 값을 추출하고 싶다면 다음과 같이 iloc을 활용할 수 있습니다. 

df.iloc[1,1] # 첫 번째 행 & 첫 번째 열이 교차되는 Cell의 값, 이미숙

 

이번에는 박철수와 김영수의 이름과 직급을 호출해보겠습니다.

df.iloc[[2,3], [1,2]] # 2,3 번째 행 & 1,2 번째 열이 교차되는 값

 

 

 

김영수를 제외한, 나머지 직원들의 전체 정보를 호출해보겠습니다.

df.iloc[[0,1,2], [0,1,2,3]] # 0,1,2 번째 행 & 0,1,2,3 번째 열이 교차되는 값
df.iloc[0:3, 0:4] # 위의 표현을 ":"를 활용하여 바꿔쓸 수 있다.

 

 

 

위에서 주의할 점은 콜론(:) 활용 시, 마지막 숫자는 제외하고 연산된다는 점입니다. 0,1,2 번째를 지정하고 싶다면 0:3으로 입력하셔야 합니다.

 

iloc 대괄호 안에 다른 하나의 대괄호만 입력하면  행에 대해서만 인덱싱을 하고 열은 "모든 열"이 생략된 것으로 간주합니다. 

df.iloc[[0,1]] # 0,1 번째 행 & 모든 열의 정보

 

 

iloc을 활용하여 사용자가 설정한 조건을 만족하는 행만 추출할 수 있습니다.

df.iloc[lambda x:x.index %2==0] # 짝수 행만 호출
df.iloc[[0,2]] # 위의 표현과 동일

 

 

 

 

■ loc: 이름 기반 인덱싱

 

loc의 활용법도 iloc과 크게 다르지 않습니다. 행의 index가 숫자로 되어 있는 경우에는 헷갈릴 수 있기 때문에 몇 가지 예시만 짚고 넘어가도록 하겠습니다.

 

최영자라는 Cell 값을 추출하기 위해 다음과 같이 loc을 활용할 수 있습니다.

df.loc[0,"성명"] # 최영자
df.loc["0","성명"] # 에러

숫자로 된 이름에 접근하실 때는 실수를 입력하지 않도록 주의하셔야 합니다. 최영자 0이라는 index를 가진 행에 있기 때문에 정수 0을 입력해야만 에러가 발생하지 않습니다.

 

박철수를 제외한 나머지 구성원의 모든 정보를 호출해보겠습니다.

df.loc[[0,1,3]]

 

 

 

 

 

긴 글 읽어주셔서 감사합니다. 궁금한 점은 댓글 남겨주시면, 답변 드리도록 하겠습니다. :)

댓글