[Pandas] .loc / .iloc
Pandas loc, Pandas iloc, Pandas .loc, Pandas .iloc, Pandas .loc / .iloc, 라벨 기반 인덱싱
1. boolean mask 에
정의
.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| a | c | |
|---|---|---|
| x | 2 | 200 |
| y | 3 | 300 |
| z | 4 | 400 |
위 .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 대응체. 생성 <…
💬 댓글