728x90
Pandas의 조건 필터링은 기본적으로 df[(조건)] 형태를 사용하지만,
조건이 복잡해질수록 &, |, 괄호가 난무하면서 코드가 길어지고 가독성이 떨어진다.
이때 query()는 마치 SQL의 WHERE절처럼 사용할 수 있어 코드를 간결하게 정리해준다.
예제 데이터
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'age': [25, 32, 40, 28, 35],
'score': [88, 92, 85, 70, 91],
'membership': ['basic', 'premium', 'basic', 'basic', 'premium']
})
1. 예제 단일 조건 필터링
df.query('age > 30')
→ age가 30을 초과하는 사람만 추출
2. 예제 복수 조건 필터링
df.query('age > 30 and score >= 90')
→ age > 30이고, score >= 90인 사람
and, or 사용 시 괄호 안 써도 됨 → & , | 보다 깔끔!
3. 예제 문자열 비교
df.query('membership == "premium"')
→ membership이 'premium'인 행만 필터링
4. 예제 변수 사용 - @변수명
threshold = 85
df.query('score >= @threshold')
→ 외부 변수 threshold를 조건에 넣을 수 있음
5. 예제 문자열 포함 조건
df.query('name.str.contains("a")', engine='python')
→ str.contains() 등 문자열 메서드는 engine='python' 필요
6. 예제 isin 조건
df.query('membership in ["basic", "premium"]')
→ isin() 대신 in 연산자로 간단하게 필터링 가능
7. 예제 조건 필터링 후 특정 컬럼만 보기
df.query('age > 30')[['name', 'score']]
→ SQL의 SELECT처럼 결과 컬럼도 지정 가능 (query는 조건만 필터함)
주의사항
주의점 | 설명 |
변수는 반드시 @ 붙이기 | query('score >= @x') |
문자열 비교는 큰따옴표 사용 | == "basic" |
문자열 함수는 engine='python' 필요 | str.contains(), str.startswith() 등 |
컬럼명에 공백/특수문자 있으면 백틱(`)으로 감싸기 | df.query("user id > 1000") |
활용 예제: 상위 조건 + 외부 변수
limit_age = 30
df.query('age >= @limit_age and membership == "premium"')
→ 나이가 30 이상이면서 premium 멤버인 사람 필터링
query()는 단순히 필터링 문법을 짧게 만드는 수준을 넘어,
SQL 스타일로 조건을 명확히 표현할 수 있는 고급 기능이다.
복잡한 조건을 명확하게 작성하고, 외부 변수와 함께 유연하게 사용하려면 반드시 익혀야 할 함수다.
728x90
반응형
'python > Pandas | Numpy' 카테고리의 다른 글
[Pandas] explode() (리스트가 들어있는 셀 행마다 분해) (1) | 2025.04.24 |
---|---|
[Pandas] eval() (열 간 수식을 짧고 빠르게 처리) (0) | 2025.04.24 |
[Pandas] filter() (0) | 2025.04.24 |
[Pandas] 조건 조합 필터링 및 추출 (0) | 2025.04.24 |
[Pandas] 데이터 타입 확인 및 변환 – dtypes, astype() (0) | 2025.04.24 |