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 70000Query 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 3979576query() Ç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 150query() 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 17query() İç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 600in 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 300query() 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 1Uygulamalı ö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: int64query() 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.0Hı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
- DataFrames Üzerinde Boole Dizinleme
- query() Yöntemi
- isin() ve between() Filtreleri
- Desene Göre Sütun Seçme