บทนำ
เมธอด query() ของ Pandas DataFrame ช่วยให้กรองแถวข้อมูลด้วยสตริงเงื่อนไข (string expression) ได้สะดวก อ่านง่ายกว่า boolean indexing แบบเดิม และรองรับตัวแปรภายนอกด้วยเครื่องหมาย @
รูปแบบพื้นฐาน
df.query("เงื่อนไข")
# ตัวอย่าง
df.query("Rank == 5")
df.query("Points > 70 and Rank < 3")
df.query("Country in ['India', 'Australia']")
ตัวอย่างครบถ้วน
import pandas as pd
# ข้อมูลทีม
Team = [
['India', 1, 100],
['Australia', 2, 85],
['England', 3, 75],
['New Zealand', 4, 65],
['South Africa', 5, 50],
['Bangladesh', 6, 40]
]
dataFrame = pd.DataFrame(Team, columns=['Country', 'Rank', 'Points'])
print("DataFrame ต้นทาง:")
print(dataFrame)
# 1. กรอง Rank เท่ากับ 5
print("\n--- ทีมที่ Rank = 5 ---")
print(dataFrame.query("Rank == 5"))
# 2. กรองหลายเงื่อนไข: Points > 70 และ Rank < 3
print("\n--- Points > 70 และ Rank < 3 ---")
print(dataFrame.query("Points > 70 and Rank < 3"))
# 3. ใช้ตัวแปรภายนอกด้วย @
threshold = 80
print(f"\n--- Points > {threshold} (ใช้ตัวแปร @threshold) ---")
print(dataFrame.query("Points > @threshold"))
# 4. ใช้ฟังก์ชัน string method
print("\n--- ชื่อประเทศขึ้นต้นด้วย 'S' ---")
print(dataFrame.query("Country.str.startswith('S')"))
ผลลัพธ์
DataFrame ต้นทาง:
Country Rank Points
0 India 1 100
1 Australia 2 85
2 England 3 75
3 New Zealand 4 65
4 South Africa 5 50
5 Bangladesh 6 40
--- ทีมที่ Rank = 5 ---
Country Rank Points
4 South Africa 5 50
--- Points > 70 และ Rank < 3 ---
Country Rank Points
0 India 1 100
1 Australia 2 85
--- Points > 80 (ใช้ตัวแปร @threshold) ---
Country Rank Points
0 India 1 100
--- ชื่อประเทศขึ้นต้นด้วย 'S' ---
Country Rank Points
4 South Africa 5 50
เปรียบเทียบ: query() vs Boolean Indexing
| คุณสมบัติ | query() | Boolean Indexing |
|---|---|---|
| ความอ่านง่าย | สูง (เขียนเป็นภาษาธรรมชาติ) | ปานกลาง |
| ตัวแปรภายนอก | ใช้ @variable | ใช้ตัวแปรโดยตรง |
| ประสิทธิภาพ | ดีสำหรับ DataFrame ใหญ่ | เร็วกว่าเล็กน้อยสำหรับ DF เล็ก |
| ชื่อคอลัมน์มีช่องว่าง | ใช้ backticks `Col Name` | ใช้ df['Col Name'] |
เคล็ดลับและข้อควรระวัง
- ชื่อคอลัมน์ที่มีช่องว่างหรือตัวอักษรพิเศษ ให้ห่อด้วย backticks:
query("`Team Name` == 'India'") - ใช้
inplace=Trueไม่ได้ (query คืน DataFrame ใหม่เสมอ) - รองรับ operator:
== != > < >= <= in not in and or not - สำหรับ regex ใช้
str.contains()ภายใน query
สรุป
query() เป็นวิธีที่สะดวกและอ่านง่ายสำหรับการกรองข้อมูล เหมาะสำหรับเงื่อนไขซับซ้อนและโค้ดที่ต้องการความชัดเจน ควรใช้ร่วมกับ @ สำหรับตัวแปรไดนามิก