
판다스를 배우면서 가장 헷갈리는 것 중 하나가 바로 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를 사용하세요.
반응형
'자격증공부 > 빅데이터분석기사 실기' 카테고리의 다른 글
| [Pandas] idxmax() 결과 변환의 숨겨진 이유 (1) | 2025.06.18 |
|---|---|
| [Pandas] pivot_table 완벽 가이드 (0) | 2025.06.17 |