페이지 불러오는 중
pandas에서 데이터를 고르는 방법은 크게 4가지입니다: [](대괄호), .loc(라벨), .iloc(위치), .at/.iat(단일 값).
헷갈림의 90%는 "라벨 슬라이스는 끝을 포함(.loc), 위치 슬라이스는 끝을 제외(.iloc)"와 "연쇄 인덱싱 대입 금지"를 지키면 사라집니다.
import pandas as pd[] — 빠른 접근, 하지만 모호함df["age"] # 열 1개 → Series
df[["name", "age"]] # 열 여러 개 → DataFrame
df[0:3] # 행 슬라이스 (위치) → 3행
df[df["age"] > 30] # 불리언 인덱싱 → 행 필터df["x"]는 열, df[0:3]는 행. 같은 대괄호인데 대상이 달라 혼동을 부릅니다.[]는 "열 뽑기"와 "불리언 필터"에만 쓰고, 라벨/위치 지정은 .loc/.iloc로 넘깁니다..loc — 라벨 기반 (끝 포함)df.loc[3] # 인덱스 라벨이 3인 행
df.loc[3, "amount"] # 행 라벨 3, 열 "amount"
df.loc[2:5, ["name", "age"]] # 라벨 2~5 (5 포함!), 두 열
df.loc[df["age"] > 30, "city"] # 불리언 + 열 지정
df.loc[:, "a":"c"] # 열 라벨 a~c (c 포함)2:5는 5를 포함합니다. (파이썬 기본 슬라이스와 다름 — 라벨은 위치가 아니므로 "5까지"가 자연스럽다는 설계)df.loc[조건, 열] = 값..iloc — 위치 기반 (끝 제외)df.iloc[0] # 첫 행
df.iloc[0, 2] # 0번 행, 2번 열
df.iloc[2:5, [0, 1]] # 위치 2,3,4 (5 제외), 0·1번 열
df.iloc[-1] # 마지막 행
df.iloc[::2] # 짝수 위치 행2:5는 5를 제외합니다 (NumPy·리스트와 동일)..at / .iat — 단일 스칼라 고속 접근df.at[3, "amount"] # 라벨로 값 1개 (가장 빠름)
df.iat[0, 2] # 위치로 값 1개반복문에서 값 하나씩 읽고 쓸 때 .loc보다 빠릅니다. 다만 애초에 반복문을 피하는 게 우선입니다 → Python - pandas 12. 성능과 함정.
df[df["age"] > 30]
df[(df["age"] > 30) & (df["city"] == "Seoul")] # & | ~, 각 조건 괄호 필수
df[df["city"].isin(["Seoul", "Busan"])]
df[df["amount"].between(100, 500)]
df[df["name"].str.startswith("K")]
df[~df["category"].isna()]and/or가 아니라 비트 연산자 &/|/~, 각 비교는 괄호로 감쌉니다 (연산자 우선순위 때문).and/or를 쓰면 The truth value of a Series is ambiguous 에러가 납니다.💡 이럴 때: 조건이 3개 이상으로 길어지면
query()가 읽기 쉽습니다.
query() — 문자열 표현식 필터df.query("age > 30 and city == 'Seoul'")
df.query("amount.between(100, 500)")
threshold = 1000
df.query("amount > @threshold") # @변수명으로 파이썬 변수 참조numexpr 엔진으로 중간 배열을 덜 만들어 빠를 수 있습니다.df.query("order date > '2026-01-01'").💡 이럴 때: 조건이 길거나 파라미터를 바꿔 가며 필터링할 때. 가독성과 속도를 함께 얻습니다.
# 나쁨 — SettingWithCopyWarning, 반영 보장 안 됨
df[df["age"] > 30]["bonus"] = 100
# 좋음 — .loc 한 번에 행+열 지정
df.loc[df["age"] > 30, "bonus"] = 100부분집합을 따로 오래 쓸 거라면 .copy():
seoul = df.loc[df["city"] == "Seoul"].copy()→ 이유와 pandas 3.0 Copy-on-Write는 Python - pandas 01. 기초 개념과 자료구조 6절.
g = df.set_index(["city", "category"]).sort_index()
g.loc["Seoul"] # 1레벨 선택
g.loc[("Seoul", "Food")] # 튜플로 두 레벨 동시 지정
g.loc[(slice(None), "Food"), :] # 2레벨만 지정 (= g.xs("Food", level="category"))
g.xs("Food", level="category")sort_index() 후에 슬라이싱해야 성능·정확성이 안정적입니다.
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.