본문으로 건너뛰기
김신건의 로그

[Pandas] .loc / .iloc

· 수정 · 📖 약 1분 · 268자/단어 #python #pandas #selection #indexing
Pandas loc, Pandas iloc, Pandas .loc, Pandas .iloc, Pandas .loc / .iloc, 라벨 기반 인덱싱

정의

  • .loc[] : 라벨 기반 인덱싱 (index/column 이름)
  • .iloc[] : 정수 위치 기반 인덱싱 (0-based)

이 두 indexer 가 pandas 선택의 표준. df[] 만으로는 헷갈리는 경우가 많아 명시적인 .loc / .iloc 권장.

기본 비교

import pandas as pd
df = pd.DataFrame(
    {'age': [25, 30, 35], 'salary': [3000, 4500, 6000]},
    index=['Alice', 'Bob', 'Charlie']
)

df.loc['Bob']               # 라벨 → Series
df.iloc[1]                  # 위치 1 → Series

df.loc['Bob', 'age']        # 스칼라
df.iloc[1, 0]               # 스칼라

df.loc[['Alice', 'Bob']]    # 여러 라벨
df.iloc[[0, 1]]             # 여러 위치

슬라이싱 (가장 중요한 차이)

df.loc['Alice':'Bob']       # ✓ 'Bob' 포함 (양쪽 inclusive!)
df.iloc[0:2]                # ✗ 위치 2 미포함 (Python 표준)

IMPORTANT

.loc 의 슬라이스는 양쪽 inclusive. .iloc 는 Python list 처럼 right-exclusive. 자주 헷갈리니 주의.

행 + 열 동시 선택

python
import pandas as pd
df = pd.DataFrame(
  {'a': [1,2,3,4], 'b': [10,20,30,40], 'c': [100,200,300,400]},
  index=['w','x','y','z']
)

# loc: 라벨로
print(df.loc['x':'z', ['a', 'c']])
print('---')
# iloc: 위치로
print(df.iloc[1:3, [0, 2]])
결과
   a    c
x  2  200
y  3  300
z  4  400
---
 a    c
x  2  200
y  3  300
ac
x2200
y3300
z4400

.loc 는 ‘z’ 포함, 아래 .iloc[1:3] 은 위치 3 (z) 미포함.

boolean mask 와 결합

df.loc[df['age'] > 30]                        # 행 필터
df.loc[df['age'] > 30, 'salary']              # 행 필터 + 컬럼
df.loc[df['age'] > 30, ['name', 'salary']]    # 행 필터 + 여러 컬럼
df.loc[df['age'] > 30, 'salary'] *= 1.1       # 조건부 갱신

값 할당

df.loc[df['age'] > 30, 'bonus'] = 500           # 조건부 추가
df.loc['Alice', 'salary'] = 9999                # 단일 셀
df.loc['Alice':'Bob', 'salary'] = [9999, 8888]  # 슬라이스 + 리스트
df.iloc[0, 1] = 99                              # 위치 기반

함정

1. boolean mask 에 .iloc 사용 불가

df.iloc[df['age'] > 30]     # ❌ NotImplementedError 또는 의미 다름
df.loc[df['age'] > 30]      # ✓

.iloc 은 정수 (또는 정수 array) 만. boolean array 는 라벨처럼 취급되는 .loc 만.

2. SettingWithCopyWarning

df[df['age'] > 30]['salary'] = 999    # ⚠️ chained indexing
df.loc[df['age'] > 30, 'salary'] = 999  # ✓

한 줄에 indexer 두 번 쓰면 결과가 view 인지 copy 인지 모호. 항상 .loc[행, 열] 한 번에 처리.

3. 정수 index 의 모호함

s = pd.Series([10, 20, 30], index=[5, 6, 7])
s.loc[5]      # label 5 → 10
s.iloc[5]     # IndexError
s[5]          # label 5 → 10 (Future 에 deprecate 예정 경고)

명확하려면 항상 .loc 또는 .iloc.

4. 단일 row 의 반환 타입

df.loc['Alice']        # Series (1차원)
df.loc[['Alice']]      # DataFrame (2차원, 한 행)

다중 행을 유지하려면 리스트로 감싼다.

참고

이 글의 용어 (4개)
[Pandas] .at / .iatpandas
정의 - : 단일 스칼라 (한 행, 한 열) 의 라벨 기반 접근 - : 단일 스칼라의 정수 위치 기반 접근 의 단일 셀 전용 빠른 버전. 내부 검증 단계를 단순화해 가장 빠른 셀…
[Pandas] 컬럼 선택pandas
정의 DataFrame 에서 하나 또는 여러 컬럼을 선택 하는 방법들. 가장 기본이자 가장 자주 쓰는 동작. 4 가지 기본 방식 단일 vs 다중 (반환 타입 차이) <CodeWi…
[Pandas] Boolean Indexingpandas
정의 Boolean Indexing 은 True/False 의 Series 를 인덱서로 전달 해 행을 선택하는 패턴. pandas 의 가장 흔한 필터링 방법. 기본 <CodeWi…
[Pandas] DataFramepandas
정의 은 2차원 레이블 테이블. 각 열이 , 모든 열이 같은 (행 라벨) 를 공유. SQL 테이블 / Excel 시트 / R data.frame 의 Python 대응체. 생성 <…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기