Pandas & NumPy Academy · पाठ

query() विधि

query() से पठनीय फ़िल्टर अभिव्यक्तियाँ स्ट्रिंग के रूप में लिखिए, @ से क्वेरी के भीतर Python चर उपयोग कीजिए और फ़िल्टरों को श्रृंखलाबद्ध कीजिए।

पाठ 2, कुल 4 में से13 चरण

query() विधि, CoddyKit पर Pandas & NumPy Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह 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') लिख सकते हैं।

क्वेरी स्ट्रिंग का मूल्यांकन 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() उन बहु-शर्तीय फ़िल्टरों के लिए बेहतर है जिनमें बूलियन इंडेक्सिंग के साथ बहुत-से कोष्ठकों की आवश्यकता होती। बूलियन इंडेक्सिंग तब बेहतर है जब आपकी शर्त में जटिल Python अभिव्यक्तियाँ हों, जैसे ऐसी विधि-कॉल, जो क्वेरी स्ट्रिंग में समर्थित नहीं हैं।

अधिकांश स्थितियों में प्रदर्शन समान रहता है; बहुत बड़े DataFrame पर query() थोड़ा तेज़ हो सकता है, क्योंकि यह पर्दे के पीछे numexpr लाइब्रेरी का इस्तेमाल करता है।

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() .str की contains() जैसी विधियों का समर्थन नहीं करता; इनके लिए .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 सदस्यता जाँच के लिए in और not in ऑपरेटरों का समर्थन करता है, जो Python सूचियों के समान हैं। यह कई == शर्तों को 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() से संख्यात्मक सीमा वाले फ़िल्टर

Python की शृंखलाबद्ध तुलनाएँ, जैसे 10 < price < 500, क्वेरी स्ट्रिंग के भीतर काम करती हैं, जिससे सीमा वाले फ़िल्टर बहुत अभिव्यक्तिपूर्ण बन जाते हैं। मानक बूलियन इंडेक्सिंग में यह 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() और विधि-शृंखला की सर्वोत्तम प्रथाएँ

आधुनिक Pandas कोड में विधि-शृंखला के भीतर query() का इस्तेमाल करना एक सर्वोत्तम प्रथा है। इससे रूपांतरण-श्रृंखला का प्रत्येक चरण स्पष्ट और स्वयं-व्याख्यात्मक बनता है। पूरी शृंखला को कोष्ठकों में रखें, ताकि बैकस्लैश के बिना उसे कई पंक्तियों में बाँटा जा सके।

पूरी तरह पठनीय प्रसंस्करण-श्रृंखलाएँ बनाने के लिए कॉलम जोड़ने हेतु 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() का अध्ययन करेंगे।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Python सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
30
पाठ
120

अक्सर पूछे जाने वाले प्रश्न

क्या “query() विधि” पाठ निःशुल्क है?

हाँ—“query() विधि” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Pandas & NumPy Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Pandas & NumPy Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“query() विधि” में मैं क्या सीखूँगा?

query() से पठनीय फ़िल्टर अभिव्यक्तियाँ स्ट्रिंग के रूप में लिखिए, @ से क्वेरी के भीतर Python चर उपयोग कीजिए और फ़िल्टरों को श्रृंखलाबद्ध कीजिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Pandas & NumPy Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Pandas & NumPy Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Pandas & NumPy Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“query() विधि” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Pandas & NumPy Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Pandas & NumPy Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. DataFrames पर बूलियन इंडेक्सिंग
  2. query() विधि
  3. isin() और between() फ़िल्टर
  4. पैटर्न के आधार पर कॉलम चुनना
← Pandas & NumPy Academy पर वापस जाएँ