Pandas는 Python에서 가장 많이 사용되는 데이터 분석 라이브러리다.
하지만 많은 개발자가 .loc[], .apply(), for 루프 같은 전통적인 방법으로 데이터를 필터링하면서 불필요하게 느린 코드를 작성하는 경우가 많다.
Pandas에는 SQL처럼 데이터를 필터링할 수 있는 query() 함수가 있다.
이 함수를 잘 활용하면 코드 가독성을 개선하면서 속도를 10배 이상 높일 수 있다.
1. query()란 무엇인가?
Pandas의 query() 함수는 SQL과 유사한 문법을 사용하여 데이터를 필터링하는 기능이다.
즉, .loc[]이나 boolean indexing을 사용하지 않고도 훨씬 직관적이고 빠르게 조건을 적용할 수 있다.
📌 기본 문법
df.query("조건식")
✅ “조건식” 안에서는 컬럼 이름을 직접 사용할 수 있음!
2. query()를 사용해야 하는 이유
1️⃣ SQL과 비슷한 직관적인 문법
• df.loc[]보다 가독성이 훨씬 좋다.
2️⃣ 최대 10배 빠른 성능
• query()는 내부적으로 NumExpr 엔진을 사용해 최적화되어 있음.
3️⃣ 동적 변수 활용 가능
• 문자열 포맷팅을 활용하면 동적으로 조건을 구성할 수 있음.
3. query() vs .loc[] 성능 비교
✅ 기존 방식 (.loc[] 사용)
import pandas as pd
import numpy as np
import time
df = pd.DataFrame({
'age': np.random.randint(10, 70, 1000000),
'salary': np.random.randint(2000, 10000, 1000000)
})
start = time.time()
filtered_df = df.loc[(df['age'] > 30) & (df['salary'] > 5000)]
end = time.time()
print(f"기존 방식 실행 시간: {end - start:.4f}초")
🔥 query() 방식 적용
start = time.time()
filtered_df = df.query("age > 30 and salary > 5000")
end = time.time()
print(f"`query()` 실행 시간: {end - start:.4f}초")
📌 결과 예시:
기존 방식 실행 시간: 0.3542초
`query()` 실행 시간: 0.0487초
✅ 약 7배 이상 빠름!
4. query()의 실전 활용법
📌 1) 여러 조건을 쉽게 적용하기
df.query("age > 30 and salary < 7000")
✅ 가독성이 훨씬 좋아짐!
📌 2) 변수 활용 (@변수명)
min_age = 40
max_salary = 6000
df.query("age > @min_age and salary < @max_salary")
✅ 동적으로 조건을 설정할 수 있음
📌 3) 문자열 필터링
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'city': ['Seoul', 'New York', 'Seoul', 'London']
})
df.query("city == 'Seoul'")
✅ SQL처럼 문자열 필터링 가능!
📌 4) query()를 활용한 복잡한 조건 필터링
df.query("(age > 30 and salary < 7000) or (age < 25 and salary > 8000)")
✅ 여러 개의 논리 연산을 쉽게 적용 가능
5. query()를 사용하면 얻을 수 있는 것
• .loc[]보다 가독성이 훨씬 좋음
• 연산 속도가 최대 10배 빠름
• 동적 변수 사용으로 유연한 데이터 필터링 가능
• SQL을 쓰듯이 데이터를 다룰 수 있어 데이터베이스와 유사한 작업이 쉬워짐
'개발' 카테고리의 다른 글
Pandas explode(): 한 줄 코드로 리스트 데이터를 행 단위로 변환하는 강력한 함수 (0) | 2025.02.19 |
---|---|
Pandas at[]과 iat[]: .loc[]보다 10배 빠른 데이터 접근법 (0) | 2025.02.19 |
python의 Polars와 Prefect 라이브러리 (0) | 2025.02.06 |
pandas의 pipe()와 groupby() (0) | 2025.02.06 |
Pandas와 Dask로 대용량 데이터 처리 완벽 최적화 (0) | 2025.02.06 |