0Pricing
Pandas & NumPy Academy · 강의

query() 메서드

query()로 읽기 쉬운 필터 표현식을 문자열로 작성하고, @를 사용해 쿼리 안에서 Python 변수를 참조하며, 필터를 연쇄적으로 적용합니다.

query() 메서드은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

query()를 사용하는 이유는 무엇인가요?

Pandas의 불리언 인덱싱은 강력하지만 여러 조건을 결합하면 장황해질 수 있습니다. query() 메서드를 사용하면 필터 표현식을 일반 문자열로 작성할 수 있어, 많은 사용자가 더 읽기 쉽다고 느낍니다. 특히 SQL을 사용해 본 경험이 있는 경우 더욱 그렇습니다. df[(df['age'] > 30) & (df['salary'] > 50000)] 대신 df.query('age > 30 and salary > 50000')처럼 작성합니다.

query 문자열은 DataFrame의 열 이름을 기준으로 평가되므로, 문자열 안에서는 열 이름이 변수 이름처럼 동작합니다.

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Carol', 'Dave'],
    'age': [25, 35, 28, 45],
    'salary': [50000, 90000, 70000, 120000]
})

# Boolean indexing style
result1 = df[(df['age'] > 27) & (df['salary'] > 60000)]

# Equivalent query() style
result2 = df.query('age > 27 and salary > 60000')

print(result2)
#     name  age  salary
# 1    Bob   35   90000
# 2  Carol   28   70000

쿼리 문자열 내부의 문법 규칙

쿼리 문자열 안에서는 표준 Python 비교 연산자(>, <, ==, !=, >=, <=)와 논리 연결어 and, or, not을 사용할 수 있습니다. 일반적인 불리언 인덱싱과 달리 여기서는 영어 단어를 사용할 수 있으므로 앰퍼샌드나 파이프가 필요하지 않습니다.

공백이 포함된 열 이름이나 Python 키워드와 충돌하는 열 이름은 백틱으로 감싸야 합니다: df.query('`first name` == "Alice"').

import pandas as pd

df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D'],
    'price': [10, 200, 50, 300],
    'in_stock': [True, False, True, True]
})

# Use 'and', 'or', 'not' in query strings
result = df.query('price > 40 and in_stock == True')
print(result)
#   product  price  in_stock
# 2       C     50      True
# 3       D    300      True

@를 사용하여 Python 변수 참조하기

query()의 주요 기능은 @ 접두사를 사용하여 주변 스코프의 Python 변수를 참조할 수 있다는 점입니다. 이를 통해 필터에 매개변수를 쉽게 적용할 수 있습니다. 임계값을 계산하여 변수에 저장한 다음, 값을 직접 입력하는 대신 쿼리 문자열 안에서 @variable_name을 사용하면 됩니다.

이 패턴은 실행 중에 필터 인수를 받는 함수에서 매우 유용합니다.

import pandas as pd

df = pd.DataFrame({
    'city': ['NYC', 'LA', 'Chicago', 'Houston'],
    'population': [8336817, 3979576, 2693976, 2320268]
})

min_pop = 3_000_000  # Python variable

# Use @ to inject the variable into the query
result = df.query('population > @min_pop')
print(result)
#    city  population
# 0   NYC     8336817
# 1    LA     3979576

query() 호출 연결하기

query()는 새로운 DataFrame을 반환하므로 여러 query 호출을 연결하거나 파이프라인에서 다른 Pandas 메서드와 결합할 수 있습니다. 연결 방식을 사용하면 각 필터링 단계를 별도의 줄에 작성할 수 있어 로직을 읽고, 오류를 찾고, 수정하기 쉽습니다.

query()를 .groupby(), .sort_values(), .head()와 같은 메서드와 연결하여 간결한 분석 파이프라인을 만들 수도 있습니다.

import pandas as pd

df = pd.DataFrame({
    'region': ['North', 'South', 'North', 'East', 'South'],
    'year': [2022, 2022, 2023, 2023, 2023],
    'revenue': [100, 200, 150, 80, 300]
})

# Chain two query calls
result = (df
    .query('year == 2023')
    .query('revenue > 100')
    .sort_values('revenue', ascending=False)
)
print(result)
#    region  year  revenue
# 4   South  2023      300
# 2   North  2023      150

query()와 불리언 인덱싱 비교

두 방법은 동일한 결과를 생성하지만 각각 적합한 용도가 있습니다. query()는 불리언 인덱싱에서 많은 괄호가 필요한 다중 조건 필터에 특히 유용합니다. 조건에 query 문자열에서 지원되지 않는 메서드 호출과 같은 복잡한 Python 표현식이 포함되어 있다면 불리언 인덱싱이 더 적합합니다.

대부분의 경우 성능은 비슷합니다. query()는 내부적으로 numexpr 라이브러리를 사용하므로 매우 큰 DataFrame에서는 약간 더 빠를 수 있습니다.

import pandas as pd

df = pd.DataFrame({
    'A': range(10),
    'B': range(10, 20)
})

# Boolean indexing
result_bool = df[(df['A'] > 2) & (df['B'] < 18) & (df['A'] != 5)]

# Equivalent query — much more readable
result_query = df.query('A > 2 and B < 18 and A != 5')

print(result_query)
#    A   B
# 3  3  13
# 4  4  14
# 6  6  16
# 7  7  17

query()에서 문자열 비교하기

문자열 리터럴을 따옴표로 감싸면 쿼리 문자열 안에서 문자열 열의 값을 기준으로 필터링할 수 있습니다. 바깥쪽 쿼리 문자열에는 큰따옴표를 사용하고 문자열 값에는 작은따옴표를 사용하거나 그 반대로 작성하면 됩니다. 단, 일관되게 사용해야 합니다. query()는 contains()와 같은 .str 메서드를 지원하지 않으므로, 이런 경우에는 .str을 사용하는 불리언 인덱싱을 사용해야 합니다.

import pandas as pd

df = pd.DataFrame({
    'country': ['USA', 'UK', 'Canada', 'USA', 'Germany'],
    'sales': [400, 150, 200, 600, 300]
})

# Single quotes for the string value inside double-quoted query
result = df.query('country == "USA"')
print(result)
#   country  sales
# 0     USA    400
# 3     USA    600

in 및 not in 연산자 사용하기

쿼리 문자열 안에서 Pandas는 Python 목록과 비슷하게 멤버십 테스트를 위한 in 및 not in 연산자를 지원합니다. 이는 여러 == 조건을 or로 연결하는 것보다 깔끔한 대안입니다. 값 목록은 쿼리 문자열 안에 직접 작성합니다.

import pandas as pd

df = pd.DataFrame({
    'status': ['active', 'inactive', 'pending', 'active', 'closed'],
    'amount': [100, 200, 50, 300, 150]
})

# Keep rows where status is in a specific list
result = df.query('status in ["active", "pending"]')
print(result)
#     status  amount
# 0   active     100
# 2  pending      50
# 3   active     300

# Exclude certain statuses
excluded = df.query('status not in ["closed", "inactive"]')
print(excluded.shape)  # (3, 2)

query()를 사용한 숫자 범위 필터

10 < price < 500과 같은 Python의 연쇄 비교를 쿼리 문자열 안에서 사용할 수 있으므로 범위 필터를 매우 표현력 있게 작성할 수 있습니다. 표준 불리언 인덱싱에서는 between()을 사용하거나 &로 결합한 두 개의 조건을 작성해야 하므로 이렇게 사용할 수 없습니다.

import pandas as pd

df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D', 'E'],
    'price': [5, 50, 150, 300, 500]
})

# Chained comparison — only works inside query()
result = df.query('50 <= price <= 300')
print(result)
#   product  price
# 1       B     50
# 2       C    150
# 3       D    300

query()의 제한 사항

query()는 강력하지만 몇 가지 제한 사항이 있습니다. 공백이나 특수 문자가 포함된 열 이름은 백틱으로 감싸야 합니다. 매우 복잡한 Python 표현식(사용자 지정 함수, 여러 줄로 이루어진 로직)은 문자열 안에서 지원되지 않습니다. 또한 열 이름이 class나 if와 같은 Python 키워드와 충돌하면 query()가 예상하지 못한 결과를 만들 수 있으므로 이러한 이름도 백틱으로 감싸야 합니다.

query()로 깔끔하게 표현할 수 없는 경우에는 표준 불리언 인덱싱으로 대체하십시오.

import pandas as pd

df = pd.DataFrame({'first name': ['Alice', 'Bob'], 'class': [1, 2]})

# Backtick-quote column names with spaces or reserved words
result = df.query('`first name` == "Alice" and `class` == 1')
print(result)
#   first name  class
# 0      Alice      1

실전 예제: 주문 필터링

다음은 query()를 변수 참조 및 groupby로의 연결과 함께 사용하는 실전 예제입니다. 먼저 필터링한 다음 집계하는 이 패턴은 처리할 필요가 없는 행을 제외하므로 더 명확하고, 큰 데이터셋에서는 더 빠르기도 합니다.

import pandas as pd

orders = pd.DataFrame({
    'region': ['East', 'West', 'East', 'West', 'East'],
    'year': [2023, 2023, 2024, 2024, 2024],
    'revenue': [100, 200, 300, 400, 500]
})

min_year = 2024

# Filter to recent orders in the East region, then sum revenue
summary = (
    orders
    .query('year >= @min_year and region == "East"')
    .groupby('region')['revenue'].sum()
)
print(summary)
# region
# East    800
# Name: revenue, dtype: int64

query() 및 메서드 연결 모범 사례

메서드 연결 안에서 query()를 사용하는 것은 최신 Pandas 코드의 모범 사례입니다. 변환 파이프라인의 각 단계를 명확하게 만들고 코드 자체가 동작을 설명하도록 해 줍니다. 전체 연결을 괄호로 감싸면 백슬래시 없이 여러 줄에 나누어 작성할 수 있습니다.

열을 추가할 때는 query()를 assign()과, 집계할 때는 groupby()와, 사용자 지정 함수에는 pipe()와 결합하여 읽기 쉬운 파이프라인을 만들 수 있습니다.

import pandas as pd

df = pd.DataFrame({
    'dept': ['Eng', 'HR', 'Eng', 'Sales', 'HR'],
    'salary': [90000, 50000, 120000, 70000, 55000],
    'years': [3, 5, 8, 2, 4]
})

result = (
    df
    .query('years > 2 and dept != "HR"')
    .assign(bonus=lambda x: x['salary'] * 0.1)
    .sort_values('salary', ascending=False)
)
print(result[['dept', 'salary', 'bonus']])
#    dept  salary   bonus
# 2   Eng  120000  12000.0
# 0   Eng   90000   9000.0

빠른 확인

query() 메서드에 대한 이해도를 확인해 보십시오.

단원 복습

이 단원에서는 다음을 배웠습니다. query()는 필터 표현식을 문자열로 받아 다중 조건 필터를 더 읽기 쉽게 만들고, @variable_name은 Python 변수를 쿼리에 삽입하며, 표준 불리언 인덱싱으로는 사용할 수 없는 in/not in과 연쇄 비교를 사용할 수 있습니다. 다음에는 간결한 멤버십 및 범위 필터를 위한 isin()과 between()을 살펴봅니다.

자주 묻는 질문

“query() 메서드” 강의는 무료인가요?

네 — “query() 메서드” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“query() 메서드”에서 뭘 배우나요?

query()로 읽기 쉬운 필터 표현식을 문자열로 작성하고, @를 사용해 쿼리 안에서 Python 변수를 참조하며, 필터를 연쇄적으로 적용합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“query() 메서드” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. DataFrames의 불리언 인덱싱
  2. query() 메서드
  3. isin() 및 between() 필터
  4. 패턴으로 열 선택하기
← Pandas & NumPy Academy(으)로 돌아가기