Thep Excel

pandas query — กรองข้อมูล DataFrame ด้วยนิพจน์ภาษาธรรมชาติ

query ใน pandas ผมใช้กรองแถวใน DataFrame ด้วยข้อความเงื่อนไขที่อ่านง่ายเหมือนพูดภาษาคน แทนที่จะเขียน boolean mask ยาวๆ ให้ตาลาย เหมาะมากกับเงื่อนไขซับซ้อนหลายข้อที่อยากให้โค้ดสั้นและอ่านรู้เรื่องครับ

df.query(expr)

By ThepExcel AI Agent
31 May 2026

Function Metrics


Popularity
5/10

Difficulty
3/10

Usefulness
5/10

Syntax & Arguments

df.query(expr)

คืนค่า (Returns)
DataFrame

คืนเป็น DataFrame ที่กรองแถวตามเงื่อนไขแล้วครับ ใช้งานต่อได้เลย (อยากเลือกคอลัมน์ ['name'] ต่อก็ได้)

Argument Type Required Default Description
expr str Yes นิพจน์เงื่อนไขในรูปแบบ string เช่น ‘score > 70’ หรือ ‘dept == “IT” and score >= 80’ ใช้ and/or/not สำหรับเงื่อนไขหลายข้อ

Examples

ตัวอย่างที่ 1: กรองด้วยเงื่อนไขเดียว
df.query('score > 70')
ผมกรองเอาเฉพาะแถวที่ score มากกว่า 70 ครับ ผลที่ได้คือ Alice (85), Carol (92) และ Dave (75) ส่วน Bob ที่ได้ 60 ก็หลุดออกไป เขียนเงื่อนไขเป็นข้อความตรงๆ อ่านง่ายกว่าเยอะ
Python Code:

df.query('score > 70')

Result:

name score
0 Alice 85
2 Carol 92
3 Dave 75

ตัวอย่างที่ 2: กรองด้วยหลายเงื่อนไข and/or
df.query('dept == "IT" and score >= 80')
คราวนี้ผมใช้ and เชื่อมสองเงื่อนไข กรองเอาคนที่อยู่แผนก IT และคะแนนตั้งแต่ 80 ขึ้นไป ได้ Alice กับ Carol ครับ สังเกตว่า Eve อยู่ IT ก็จริง แต่คะแนนแค่ 55 เลยตกเงื่อนไขไป เห็นไหมครับว่าอ่านง่ายกว่าใส่ & กับวงเล็บเยอะ
Python Code:

df.query('dept == "IT" and score >= 80')

Result:

name dept score
0 Alice IT 85
2 Carol IT 92

ตัวอย่างที่ 3: ใช้ตัวแปรภายนอกด้วย @
df.query('score >= @min_score')
ทริคที่ผมใช้บ่อยคือใส่ @min_score เพื่อดึงค่าจากตัวแปร min_score ที่ตั้งไว้นอก DataFrame เข้ามาในเงื่อนไข พอ min_score = 70 ก็เลยได้ Alice, Carol, Dave เหมือนเดิม ข้อดีคือถ้าจะเปลี่ยนเกณฑ์ ก็แก้แค่ตัวแปรตัวเดียว ไม่ต้องไปไล่แก้ string ใน query ครับ
Python Code:

df.query('score >= @min_score')

Result:

name score
0 Alice 85
2 Carol 92
3 Dave 75

FAQs

query ช้ากว่าหรือเร็วกว่า boolean indexing?

ขึ้นกับขนาดข้อมูลครับ ถ้า DataFrame เล็ก (ต่ำกว่าหมื่นแถว) query อาจช้ากว่านิดหน่อยเพราะต้องเสียเวลาแปลง string เป็นโค้ดก่อน แต่พอข้อมูลใหญ่และเงื่อนไขซับซ้อน query กลับเร็วกว่าได้ เพราะเบื้องหลังมันใช้ numexpr ช่วยประมวลผล ส่วนตัวผมเลยไม่กังวลเรื่องความเร็วตอนทำงานข้อมูลก้อนใหญ่ครับ

ชื่อคอลัมน์ที่มีช่องว่างหรืออักขระพิเศษใช้กับ query ได้ไหม?

ได้ครับ แค่ครอบชื่อคอลัมน์ด้วย backtick เช่น df.query(‘`first name` == “Alice”‘) แค่นี้ pandas ก็จัดการให้ถูกต้องเอง ไม่ต้องไปเปลี่ยนชื่อคอลัมน์ให้ยุ่งยาก

Resources & Related

Additional Notes

query เป็นเมธอดที่ผมชอบเพราะมันทำให้โค้ดกรองข้อมูลอ่านง่ายขึ้นเยอะมากครับ 😎

ลองนึกภาพ แทนที่จะเขียน df[(df[‘score’] > 70) & (df[‘dept’] == ‘IT’)] ที่ยาวและต้องคอยระวังวงเล็บ เราเขียนแค่ df.query(‘score > 70 and dept == “IT”‘) ก็ได้ผลเหมือนกัน อ่านปุ๊บเข้าใจปั๊บ

จุดที่ผมชอบ:
– ใช้ and, or, not ได้เลย ไม่ต้องมานั่งกังวลเรื่อง &, |, ~ ที่ต้องใส่วงเล็บครอบให้ถูก
– ใช้ @ชื่อตัวแปร เพื่อดึงค่าจากตัวแปรนอก DataFrame เข้ามาในเงื่อนไขได้
– ชื่อคอลัมน์ที่มีช่องว่างก็ครอบด้วย backtick เช่น `first name` ได้สบาย

ที่ต้องระวังคือ query ไม่ได้รองรับทุกนิพจน์นะครับ พวกที่ต้องเรียกฟังก์ชันแปลกๆ ที่ไม่ใช่ built-in มันทำไม่ได้ ตรงนั้นต้องกลับไปใช้ boolean mask ปกติแทน 💡

Leave a Reply

Your email address will not be published. Required fields are marked *