เมธอด 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() แทน จะเร็วกว่าและอ่านง่ายกว่ามาก