0Pricing
Pandas & NumPy Academy · Ders

query() Yöntemi

query() ile okunabilir filtre ifadelerini dizeler olarak yazın, @ kullanarak sorgularda Python değişkenlerini kullanın ve filtreleri zincirleyin.

query() Yöntemi, CoddyKit'te ücretsiz bir Pandas & NumPy Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Pandas & NumPy Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.

Neden query() Kullanılır?

Pandas boole dizinleme güçlüdür; ancak çok sayıda koşul birleştirildiğinde ayrıntılı hâle gelebilir. query() yöntemi, filtre ifadelerini düz dizeler olarak yazmanızı sağlar; özellikle SQL geçmişinden gelen birçok kişi bunu daha okunabilir bulur. df[(df['age'] > 30) & (df['salary'] > 50000)] yerine df.query('age > 30 and salary > 50000') yazarsınız.

query dizesi DataFrame'in sütun adlarına göre değerlendirilir; bu nedenle sütun adları, dize içinde değişken adları gibi davranır.

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

Query Dizesi İçindeki Sözdizimi Kuralları

Bir query dizesi içinde standart Python karşılaştırma işleçlerini (>, <, ==, !=, >=, <=) ve mantıksal bağlaçları and, or, not kullanabilirsiniz. Normal boole dizinlemeden farklı olarak burada İngilizce sözcükleri kullanabilirsiniz; ve işaretlerine veya dikey çizgilere gerek yoktur.

Boşluk içeren ya da Python anahtar sözcükleriyle çakışan sütun adları ters tırnak içine alınmalıdır: 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

@ ile Python Değişkenlerine Başvurma

query() yönteminin önemli bir özelliği, çevreleyen kapsam içindeki Python değişkenlerine @ ön ekiyle başvurabilmenizdir. Bu, filtreleri parametreleştirmeyi kolaylaştırır: bir eşik hesaplayın, bunu bir değişkende saklayın ve değeri sabit olarak yazmak yerine query dizesi içinde @variable_name kullanın.

Bu kalıp, çalışma zamanında filtre bağımsız değişkenlerini kabul eden işlevlerde çok kullanışlıdır.

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() Çağrılarını Zincirleme

query() yeni bir DataFrame döndürdüğü için birden çok query çağrısını veya diğer Pandas yöntemlerini bir işlem hattında zincirleyebilirsiniz. Zincirleme, her filtreleme adımını kendi satırında tutarak mantığın okunmasını, hatalarının ayıklanmasını ve değiştirilmesini kolaylaştırır.

Kısa analiz işlem hatları oluşturmak için query() çağrısını .groupby(), .sort_values() veya .head() gibi yöntemlerle de zincirleyebilirsiniz.

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() ile Boole Dizinlemeyi Karşılaştırma

Her iki yöntem de aynı sonucu üretir; ancak her birinin uygun olduğu yer farklıdır. query(), boole dizinlemeyle çok sayıda parantez gerektirecek çok koşullu filtrelerde öne çıkar. Koşulunuz query dizelerinde desteklenmeyen yöntem çağrıları gibi karmaşık Python ifadeleri içerdiğinde boole dizinleme daha uygundur.

Çoğu durumda performans benzerdir; query(), arka planda numexpr kitaplığını kullandığı için çok büyük DataFrame'lerde biraz daha hızlı olabilir.

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() İçinde Dize Karşılaştırmaları

Bir sorgu dizesi içinde dize sütunu değerlerine göre filtreleme yapmak için dize sabitini tırnak içine alın. Dış sorgu dizesi için çift tırnak, dize değeri için tek tırnak kullanın veya tam tersini yapın; yalnızca tutarlı olun. query(), contains() gibi .str yöntemlerini desteklemez; bunlar için .str ile boole dizinlemeyi kullanın.

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 ve not in işleçlerini kullanma

Pandas, sorgu dizeleri içinde üyelik testleri için Python listelerindekilere benzer şekilde in ve not in işleçlerini destekler. Bu, birden çok == koşulunu or ile zincirlemek yerine kullanılabilecek anlaşılır bir alternatiftir. Değerler listesi doğrudan sorgu dizesi içinde yazılır.

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() ile sayısal aralık filtreleri

Python'daki zincirlenmiş karşılaştırmalar, örneğin 10 < price < 500, sorgu dizeleri içinde çalışır ve aralık filtrelerini oldukça ifade edilebilir hâle getirir. Standart boole dizinlemede between() kullanmadan veya & ile birleştirilmiş iki ayrı koşul oluşturmadan bunu yapmak mümkün değildir.

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() sınırlamaları

query() güçlüdür, ancak birkaç sınırlaması vardır. Boşluk veya özel karakter içeren sütun adları ters tırnakla yazılmalıdır. Çok karmaşık Python ifadeleri (özel işlevler, birden çok satıra yayılan mantık) dize içinde desteklenmez. Ayrıca sütun adları class veya if gibi Python anahtar sözcükleriyle çakışırsa query() beklenmedik sonuçlar üretebilir; bunları da ters tırnak içine alın.

query() ile anlaşılır biçimde ifade edilemeyen durumlarda standart boole dizinlemeye başvurun.

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

Uygulamalı örnek: siparişleri filtreleme

Burada query() yönteminin bir değişken başvurusu ve groupby zinciriyle birlikte kullanıldığı uygulamalı bir örnek yer alıyor. Bu kalıp — önce filtreleyip sonra toplulaştırmak — gerekmeyen satırları işlemeyi önler; bu da büyük veri kümelerinde hem daha anlaşılır hem de daha hızlıdır.

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() ve yöntem zincirleri için en iyi uygulamalar

Yöntem zinciri içinde query() kullanmak, modern Pandas kodunda en iyi uygulamalardan biridir. Dönüştürme işlem hattının her adımını anlaşılır ve kendi kendini açıklayan bir yapıya dönüştürür. Tüm zinciri parantez içine alın; böylece ters bölü çizgiler kullanmadan zinciri birden çok satıra bölebilirsiniz.

Sütun eklemek için query() yöntemini assign() ile, toplulaştırmalar için groupby() ile ve özel işlevler için pipe() ile birleştirerek tamamen okunabilir işlem hatları oluşturun.

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

Hızlı kontrol

query() yöntemini anlayıp anlamadığınızı test edin.

Ders özeti

Bu derste şunları öğrendiniz: query(), filtre ifadelerini dize olarak kabul eder ve birden çok koşul içeren filtreleri daha okunabilir hâle getirir; @variable_name, Python değişkenlerini sorguya aktarır; ayrıca standart boole dizinlemeyle mümkün olmayan in/not in ve zincirlenmiş karşılaştırmaları kullanabilirsiniz. Sırada, kısa ve öz üyelik ve aralık filtreleri için isin() ve between() yöntemlerini inceleyeceğiz.

Sıkça Sorulan Sorular

“query() Yöntemi” dersi ücretsiz mi?

Evet — “query() Yöntemi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Pandas & NumPy Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.

“query() Yöntemi” dersinde ne öğreneceğim?

query() ile okunabilir filtre ifadelerini dizeler olarak yazın, @ kullanarak sorgularda Python değişkenlerini kullanın ve filtreleri zincirleyin. Pandas & NumPy Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Pandas & NumPy Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Pandas & NumPy Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“query() Yöntemi” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Pandas & NumPy Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Pandas & NumPy Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. DataFrames Üzerinde Boole Dizinleme
  2. query() Yöntemi
  3. isin() ve between() Filtreleri
  4. Desene Göre Sütun Seçme
← Pandas & NumPy Academy Sayfasına Dön