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

Python Pandas - วนลูปหาแถวที่มีข้อความที่ต้องการด้วย itertuples() และ find()

เมธอด itertuples() ใช้วนลูป (iterate) ผ่านแถวของ DataFrame ได้อย่างมีประสิทธิภาพ (เร็วกว่า iterrows() มาก) คืนค่าเป็น namedtuple ที่เข้าถึงค่าได้ทั้งแบบ index และชื่อคอลัมน์

ขั้นตอนการทำงาน

1. โหลดข้อมูล

import pandas as pd

dataFrame = pd.read_csv(r"C:\Users\amit_\Desktop\CarRecords.csv")

2. วนลูปและค้นหาข้อความ "Lamborghini" ในคอลัมน์ Car

for row in dataFrame.itertuples():
    if row.Car.find('Lamborghini') != -1:  # หรือใช้ 'Lamborghini' in row.Car
        print(row)

โค้ดตัวอย่างสมบูรณ์

import pandas as pd

dataFrame = pd.read_csv(r"C:\Users\amit_\Desktop\CarRecords.csv")
print("DataFrame:\n", dataFrame)

# วนลูปหาแถวที่ Car มีคำว่า Lamborghini
for row in dataFrame.itertuples():
    if row.Car.find('Lamborghini') != -1:
        print(row)

ผลลัพธ์

Pandas(Index=5, Car='Lamborghini', Place='Chandigarh', UnitsSold=80)
Pandas(Index=8, Car='Lamborghini', Place='Delhi', UnitsSold=100)

คำอธิบาย itertuples()

  • คืนค่า namedtuple ชื่อ Pandas
  • เข้าถึงค่าได้ 2 แบบ: row[1] (index) หรือ row.Car (ชื่อคอลัมน์) → แนะนำใช้ชื่อคอลัมน์
  • Index = index เดิมของ DataFrame (ไม่ใช่ลำดับในลูป)
  • เร็วกว่า iterrows() ประมาณ 10-100 เท่า
  • ไม่รองรับการแก้ไขค่าใน DataFrame (read-only)

เปรียบเทียบ Iteration Methods

เมธอดความเร็วคืนค่าแก้ไขได้?
itertuples()⚡ เร็วที่สุดnamedtupleไม่ได้
iterrows()🐢 ช้า(index, Series)ได้ (แต่ไม่แนะนำ)
items()ปานกลาง(col_name, Series)ได้
apply()เร็ว (vectorized)Series/DataFrameได้ (return new)
vectorized ops⚡⚡ เร็วสุดSeries/DataFrameได้ (return new)

วิธีที่ดีกว่า: Vectorized String Operations

# เร็วกว่าและสั้นกว่ามาก
mask = dataFrame['Car'].str.contains('Lamborghini')
result = dataFrame[mask]
print(result)

# หรือ exact match
result = dataFrame[dataFrame['Car'] == 'Lamborghini']

เมื่อไหร่ควรใช้ itertuples()

  • ต้องทำ logic ซับซ้อนต่อแถว ที่ vectorized ไม่ได้
  • ต้องเรียก external API ต่อแถว
  • ต้องสร้าง object 複雜 ต่อแถว
  • ข้อมูลเล็ก (<10k rows) ที่ performance ไม่ใช่ปัญหา

⚠️ คำเตือน

หลีกเลี่ยงการใช้ loop ใน Pandas ถ้าเป็นไปได้ ใช้ Vectorized Operations, apply(), groupby(), query() แทน จะเร็วกว่าและอ่านง่ายกว่ามาก