Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python Pandas: กรองแถวข้อมูลด้วย query() ตามเงื่อนไขคอลัมน์

บทนำ

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