0Pricing
Pandas & NumPy Academy · บทเรียน

เมธอด query()

เขียนนิพจน์กรองที่อ่านง่ายในรูปสตริงด้วย query() ใช้ตัวแปร Python ภายในคำค้นด้วย @ และเชื่อมการกรองหลายชุดเข้าด้วยกัน

เมธอด query() เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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') ได้

สตริง 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

กฎไวยากรณ์ภายในสตริง Query

ภายในสตริง query คุณสามารถใช้ตัวดำเนินการเปรียบเทียบมาตรฐานของ Python (>, <, ==, !=, >=, <=) และตัวเชื่อมตรรกะ and, or, not ได้ ต่างจากการทำดัชนีแบบบูลีนทั่วไป ตรงที่คุณใช้คำภาษาอังกฤษเหล่านี้ได้โดยไม่ต้องใช้เครื่องหมายแอมเพอร์แซนด์หรือไพป์

ชื่อคอลัมน์ที่มีช่องว่างหรือซ้ำกับคำสงวนของ Python ต้องครอบด้วยเครื่องหมาย backtick: 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 ภายในสตริง query แทนการเขียนค่าแบบตายตัว

รูปแบบนี้มีประโยชน์มากในฟังก์ชันที่รับอาร์กิวเมนต์สำหรับกรองขณะทำงาน

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 ที่ซับซ้อน เช่น การเรียกเมธอดที่ไม่รองรับในสตริง query

โดยทั่วไปประสิทธิภาพใกล้เคียงกัน แต่ query() อาจเร็วกว่าเล็กน้อยกับ DataFrame ขนาดใหญ่มาก เพราะภายในใช้ไลบรารี 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 ได้โดยใส่เครื่องหมายครอบค่าคงที่สตริง ใช้เครื่องหมายคำพูดคู่ครอบสตริง 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

ภายในสตริง query นั้น Pandas รองรับตัวดำเนินการ in และ not in สำหรับตรวจสอบการเป็นสมาชิกเช่นเดียวกับรายการของ Python วิธีนี้เป็นทางเลือกที่อ่านง่ายกว่าการต่อเงื่อนไข == หลายข้อด้วย or โดยเขียนรายการค่าต่าง ๆ ไว้โดยตรงในสตริง query

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 ใช้ได้ภายในสตริง query ทำให้สร้างตัวกรองช่วงได้อย่างสื่อความหมาย วิธีนี้ไม่สามารถทำได้ด้วยการทำดัชนีแบบบูลีนมาตรฐาน หากไม่ใช้ 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() มีประสิทธิภาพสูง แต่ก็มีข้อจำกัดบางประการ ชื่อคอลัมน์ที่มี ช่องว่างหรืออักขระพิเศษ ต้องครอบด้วย backtick นิพจน์ Python ที่ซับซ้อนมาก เช่น ฟังก์ชันที่กำหนดเองหรือตรรกะหลายบรรทัด ไม่รองรับภายในสตริง นอกจากนี้ query() อาจให้ผลลัพธ์ที่ไม่คาดคิด หากชื่อคอลัมน์ซ้ำกับคำสงวนของ Python เช่น class หรือ if ซึ่งต้องครอบด้วย backtick เช่นกัน

สำหรับสิ่งที่ 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 ลงใน query และคุณสามารถใช้ in/not in รวมถึงการเปรียบเทียบแบบต่อเนื่อง ซึ่งไม่สามารถใช้กับการทำดัชนีแบบบูลีนมาตรฐานได้ บทถัดไปเราจะสำรวจ isin() และ between() สำหรับตัวกรองการเป็นสมาชิกและช่วงค่าที่กระชับยิ่งขึ้น

คำถามที่พบบ่อย

บทเรียน “เมธอด query()” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เมธอด query()” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เมธอด query()”

เขียนนิพจน์กรองที่อ่านง่ายในรูปสตริงด้วย query() ใช้ตัวแปร Python ภายในคำค้นด้วย @ และเชื่อมการกรองหลายชุดเข้าด้วยกัน คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “เมธอด query()” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การใช้ดัชนีบูลีนกับ DataFrames
  2. เมธอด query()
  3. ตัวกรอง isin() และ between()
  4. การเลือกคอลัมน์ตามรูปแบบชื่อ
← กลับไปที่ Pandas & NumPy Academy