본문 바로가기
자격증공부/빅데이터분석기사 실기

[Pandas] loc vs iloc: 헷갈리지 말고 정확히 사용하기

by non-non 2025. 6. 20.

 

판다스를 배우면서 가장 헷갈리는 것 중 하나가 바로 df.loc[]와 df.iloc[]입니다.

둘 다 데이터를 선택하는 기능이지만 접근 방식이 완전히 다릅니다.

이번 글에서는 두 방법의 차이점을 명확히 알아보고, 언제 어떤 것을 써야 하는지 정리해보겠습니다.

1. 핵심 차이점 한눈에 보기

  df.loc[] df.iloc[]
기준 레이블(label) 기준 정수 위치(integer position) 기준
인덱스 행/열 이름을 사용 행/열 번호(0부터 시작)를 사용
사용 형태 df.loc[행이름, 열이름] df.iloc[행번호, 열번호]
슬라이싱 끝 값 포함 끝 값 미포함

 

2. df.loc[] 사용법: 이름으로 접근하기

loc는 "레이블(이름)"을 기준으로 데이터에 접근합니다.

 

  • 기본 사용법
import pandas as pd

data = {
    '이름': ['철수', '영희', '민수', '지은'],
    '나이': [23, 21, 22, 25],
    '성별': ['남', '여', '남', '여'],
    '점수': [85, 92, 78, 88]
}

df = pd.DataFrame(data, index=['학생A', '학생B', '학생C', '학생D'])
print(df)

 

     이름  나이 성별  점수
학생A  철수  23  남   85
학생B  영희  21  여   92
학생C  민수  22  남   78
학생D  지은  25  여   88

 

# 특정 행 전체 선택
print(df.loc['학생A'])
# 결과: 이름    철수, 나이    23, 성별    남, 점수    85

# 특정 행의 특정 열 선택
print(df.loc['학생B', '이름'])
# 결과: 영희

# 여러 행과 열 동시 선택
print(df.loc[['학생A', '학생C'], ['이름', '점수']])
# 결과:
#      이름  점수
# 학생A  철수   85
# 학생C  민수   78
 
  • 조건부 선택
# 나이가 22 이상인 학생들
print(df.loc[df['나이'] >= 22])

# 여학생들의 이름과 점수
print(df.loc[df['성별'] == '여', ['이름', '점수']])
  • 슬라이싱
# 학생A부터 학생C까지 (끝 값 포함!)
print(df.loc['학생A':'학생C'])

# 이름부터 성별까지 열 선택
print(df.loc[:, '이름':'성별'])

3. df.iloc[] 사용법: 번호로 접근하기

iloc는 정수 위치(번호)를 기준으로 데이터에 접근합니다.

  • 기본 사용법
# 첫 번째 행 전체 선택 (0부터 시작)
print(df.iloc[0])
# 결과: 이름    철수, 나이    23, 성별    남, 점수    85

# 두 번째 행의 첫 번째 열 값
print(df.iloc[1, 0])
# 결과: 영희

# 특정 행과 열 선택
print(df.iloc[[0, 2], [0, 3]])  # 1,3번째 행의 1,4번째 열
# 결과:
#      이름  점수
# 학생A  철수   85
# 학생C  민수   78
  • 슬라이싱
# 첫 번째부터 세 번째 행까지 (끝 값 미포함!)
print(df.iloc[0:3])  # 0, 1, 2번째 행만 선택

# 처음 두 열만 선택
print(df.iloc[:, 0:2])  # 0, 1번째 열만 선택
  • 마지막 요소 접근
# 마지막 행
print(df.iloc[-1])

# 마지막 행의 마지막 열
print(df.iloc[-1, -1])
# 결과: 88

🐣실무에서 언제 어떤 걸 쓸까?

  • loc를 사용하는 경우
# 1. 데이터의 의미에 따른 선택
high_scorers = df.loc[df['점수'] >= 85, ['이름', '점수']]

# 2. 날짜 인덱스가 있는 시계열 데이터
# df.loc['2023-01-01':'2023-12-31']

# 3. 명확한 라벨이 있는 데이터
female_students = df.loc[df['성별'] == '여']
  • iloc를 사용하는 경우
# 1. 데이터의 구조적 위치가 중요한 경우
first_3_rows = df.iloc[:3]  # 처음 3개 행

# 2. 샘플링이나 무작위 선택
sample_data = df.iloc[::2]  # 짝수 번째 행들만

# 3. 머신러닝에서 특성과 타겟 분리
X = df.iloc[:, :-1]  # 마지막 열 제외한 모든 열
y = df.iloc[:, -1]   # 마지막 열만

‼️자주 하는 실수들

1. 슬라이싱 범위 착각

# loc: 끝 값 포함
df.loc['학생A':'학생C']  # 학생A, 학생B, 학생C 모두 포함

# iloc: 끝 값 미포함  
df.iloc[0:3]  # 0, 1, 2번째만 포함 (3번째 제외)

 

2. 인덱스 타입 혼동

# 숫자 인덱스가 있어도 loc는 레이블로 인식
df_numeric = df.reset_index(drop=True)  # 0, 1, 2, 3 인덱스

df_numeric.loc[1]    # 인덱스가 1인 행 (레이블 1)
df_numeric.iloc[1]   # 두 번째 행 (위치 1)

 

3. 조건부 선택 시 혼용

# 올바른 방법
df.loc[df['나이'] > 22, '이름']

# 잘못된 방법 (에러 발생)
# df.iloc[df['나이'] > 22, 0]  # iloc는 불린 인덱싱 불가

성능 비교

일반적으로 iloc가 loc보다 약간 빠릅니다:

import time

# 큰 데이터프레임 생성
large_df = pd.DataFrame(np.random.randn(100000, 4), 
                       columns=['A', 'B', 'C', 'D'])

# iloc 성능 테스트
start = time.time()
for _ in range(1000):
    result = large_df.iloc[50000, 2]
iloc_time = time.time() - start

# loc 성능 테스트  
start = time.time()
for _ in range(1000):
    result = large_df.loc[50000, 'C']
loc_time = time.time() - start

print(f"iloc: {iloc_time:.4f}초")
print(f"loc: {loc_time:.4f}초")

하지만 이 차이는 미미하므로, 가독성과 명확성을 우선시하는 것이 좋습니다.

💛마무리

언제 뭘 써야 할까요?

  • 의미 기반 선택이 필요하면 → loc 사용
  • 위치 기반 선택이 필요하면 → iloc 사용
  • 조건부 필터링을 할 때는 → loc 사용
  • 구조적 데이터 처리를 할 때는 → iloc 사용

두 방법 모두 강력한 도구이지만, 상황에 맞게 적절히 선택하는 것이 중요합니다. 처음에는 헷갈릴 수 있지만, 몇 번 연습하면 자연스럽게 구분해서 사용할 수 있게 될 거예요!

가장 중요한 것은 코드의 의도를 명확하게 표현하는 것입니다. 데이터의 이름이 중요하다면 loc를, 순서가 중요하다면 iloc를 사용하세요.

반응형