Pandas 에서 제일 헷갈리는 게 뭐냐면 원하는 row 와 column 을 어떻게 고르느냐야. 라이브러리는 indexing 스타일을 세 가지나 내놓고, 초보자는 그걸 머릿속에서 섞다가 에러 한 줄 없이 틀린 답을 만들어. 기준 하나 줄게.
세 indexer
df['col']— label 로 column 하나 집기. Series 반환.df.loc[row_label, col_label]— label 기반 selection. Row 와 column 둘 다 label (또는 boolean mask) 로 지정.df.iloc[row_pos, col_pos]— position 기반 selection. Row 와 column 둘 다 정수 위치로 지정 — NumPy 배열 다루듯이.
.loc 은 label, .iloc 은 position — 머릿속에서 절대 섞지 마. Legacy df.ix 는 사라졌어. df[df.col > 0]['other'] = ... 같은 chained indexing 은 SettingWithCopyWarning 의 원조인데, Pandas 3.0 이 Copy-on-Write 의미론으로 그 나사를 한층 더 죄었어.
Copy-on-Write 시대
Pandas 3.0 은 Copy-on-Write (CoW) 를 기본으로 켰어. 실제 효과는 이래: 부모 DataFrame 을 몰래 고치던 chained 할당이 이제는 copy 를 고치거나 (그래서 변경이 증발하거나) 명확한 에러를 raise 해. 고치는 방법은 예나 지금이나 하나야 — 할당의 왼쪽에 row 와 column 이 둘 다 들어간 단일 .loc.