Thep Excel

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

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

>_
df.query(expr)

ความนิยม5/10
ความยาก3/10
ประโยชน์5/10

อัปเดต 31 May 2026

Syntax & Arguments

คืนค่าDataFrame

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

อาร์กิวเมนต์ ชนิด คำอธิบาย
expr str นิพจน์เงื่อนไขในรูปแบบ string เช่น ‘score > 70’ หรือ ‘dept == “IT” and score >= 80’ ใช้ and/or/not สำหรับเงื่อนไขหลายข้อ

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 ปกติแทน 💡

Examples

ตัวอย่างที่ 1: กรองด้วยเงื่อนไขเดียวdf.query('score > 70')

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

>_
df.query('score > 70')

ผลลัพธ์ name score
0 Alice 85
2 Carol 92
3 Dave 75
ตัวอย่างที่ 2: กรองด้วยหลายเงื่อนไข and/ordf.query('dept == "IT" and score >= 80')

คราวนี้ผมใช้ and เชื่อมสองเงื่อนไข กรองเอาคนที่อยู่แผนก IT และคะแนนตั้งแต่ 80 ขึ้นไป ได้ Alice กับ Carol ครับ สังเกตว่า Eve อยู่ IT ก็จริง แต่คะแนนแค่ 55 เลยตกเงื่อนไขไป เห็นไหมครับว่าอ่านง่ายกว่าใส่ & กับวงเล็บเยอะ

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

ผลลัพธ์ 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 ครับ

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

ผลลัพธ์ 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

ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas query จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้pandas querySelection
Logic (2)
numpy where

numpy.where ผมใช้เลือกค่าจาก array ตามเงื่อนไขที่กำหนดครับ ถ้าให้เทียบง่ายๆ มันคือ IF ใน Excel นั่นแหละ แต่เก่งกว่าตรงที่ทำงานกับข้อมูลทั้ง array พร้อมกันในทีเดียว แถมยังใส่อาร์กิวเมนต์เดียวเพื่อหา index ที่ตรงเงื่อนไขได้อีกด้วย

pandas between

between ใน pandas ผมใช้เช็คว่าค่าในคอลัมน์อยู่ในช่วง [left, right] หรือเปล่า คืนออกมาเป็น Series ของ True/False (เรียกว่า boolean mask) เอาไปกรองแถวต่อได้เลย ถ้าใครเคยเขียนเงื่อนไขใน Excel แบบ ยอด >= 100 AND <= 500 ตัวนี้คือคำสั่งสั้นๆ ที่ทำแบบนั้นให้ในบรรทัดเดียวครับ

Cleaning (2)
pandas dropna

dropna ใน pandas ผมใช้สำหรับกำจัดแถวหรือคอลัมน์ที่มีค่า NaN ออกจาก DataFrame ครับ เหมาะมากสำหรับขั้นตอนทำความสะอาดข้อมูลก่อนวิเคราะห์ เพราะค่า NaN แฝงอยู่ในข้อมูลจริงแทบทุกชุด

pandas isna

isna ใน pandas ผมใช้สำหรับเช็คว่าแต่ละช่องใน DataFrame มีค่าว่าง (NaN) อยู่หรือเปล่า คืนผลเป็น True/False ทุกช่อง เหมือน ISBLANK ใน Excel เลยครับ แต่ทำได้กับทั้งตารางพร้อมกันในคำสั่งเดียว

Selection (2)
pandas isin

isin ใน pandas ผมใช้เช็คว่าแต่ละค่าในคอลัมน์ตรงกับค่าใน list ที่กำหนดไหม คืนมาเป็น True/False ทีละแถว ถ้าใครเคย filter หลายค่าพร้อมกันใน Excel หรือเขียน OR หลายเงื่อนไขซ้อนๆ กัน ตัวนี้คือทางลัดที่สะอาดกว่ามากครับ

pandas loc

df.loc ใน pandas ผมใช้สำหรับเลือกข้อมูลจาก DataFrame โดยระบุ label ของแถวและคอลัมน์ ไม่ว่าจะเลือกแถวเดียว หลายแถว หรือกรองด้วยเงื่อนไข Boolean เหมือนการกด Ctrl+F ใน Excel แต่ทรงพลังกว่ามากครับ

Aggregation (1)
pandas groupby

groupby ใน pandas ผมใช้สำหรับจัดกลุ่มข้อมูลใน DataFrame แล้วคำนวณค่าสรุปในแต่ละกลุ่ม เช่น หาผลรวม ค่าเฉลี่ย หรือค่าสถิติต่างๆ ตามหมวดหมู่ที่กำหนด ถ้าใครเคยใช้ PivotTable ใน Excel มาก่อน บอกเลยว่าตัวนี้คือเครื่องมือสายเดียวกันเลยครับ

Inspection (1)
pandas head

head ใน pandas ผมใช้สำหรับดูข้อมูลแถวแรกๆ ของ DataFrame เพื่อเช็กว่าโหลดข้อมูลมาถูกต้องหรือเปล่า คล้ายกับการ scroll ไปดูบนสุดของตาราง Excel เลยครับ

IO (1)
pandas read_csv

read_csv ใน pandas ผมใช้สำหรับโหลดข้อมูลจากไฟล์ CSV หรือ text ที่มีตัวคั่นเข้ามาเป็น DataFrame พร้อมใช้งาน ถ้าใครเคยเปิดไฟล์ CSV ใน Excel แล้วได้ตารางให้แก้งานต่อ read_csv ก็คือสิ่งเดียวกันเลยครับแต่สำหรับ Python

Transform (1)
pandas .str

pandas .str accessor ทำให้ผมใช้ text functions อย่าง upper, replace, contains กับทุกแถวในคอลัมน์พร้อมกันบรรทัดเดียว เหมือนได้ UPPER/SUBSTITUTE/SEARCH ของ Excel แต่ไม่ต้องลากสูตรทีละเซลล์ครับ

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่