บทนำ
DataFrame.loc[] ใช้เข้าถึงแถว/คอลัมน์ด้วย label สามารถใช้เพิ่มแถวใหม่ได้โดยระบุ index ใหม่คือ len(df) เป็นวิธีที่แนะนำแทน append() ที่ deprecated แล้ว
ตัวอย่างโค้ด
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]
]
df = pd.DataFrame(Team, columns=['Country', 'Rank', 'Points'])
print("DataFrame ต้นทาง:")
print(df)
# แถวใหม่
new_row = ['Sri Lanka', 7, 30]
# เพิ่มด้วย loc[len(df)]
df.loc[len(df)] = new_row
print("\nDataFrame หลังเพิ่มแถว:")
print(df)
ผลลัพธ์
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
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
6 Sri Lanka 7 30
เปรียบเทียบ: loc[] vs append() vs concat()
| วิธี | Syntax | Performance | สถานะ |
|---|---|---|---|
| df.loc[len(df)] = row | Simple | เร็ว (single row) | ✅ แนะนำ |
| df.append() | df.append(new_df) | ช้า (copy ทุกครั้ง) | ❌ Deprecated |
| pd.concat() | pd.concat([df, new_df]) | ดี (batch) | ✅ แนะนำหลายแถว |
กรณี Index ไม่ใช่ RangeIndex
# ถ้า index ไม่ใช่ 0,1,2...
df_custom = df.set_index('Country')
# df_custom.index = ['India', 'Australia', ...]
# ใช้ index สูงสุด + 1 หรือ uuid
new_index = df_custom.index.max() + 1 # ถ้าเป็น numeric
# หรือ
import uuid
new_index = str(uuid.uuid4())
df_custom.loc[new_index] = [7, 30] # Rank, Points (Country เป็น index)
ข้อควรระวัง
- ลิสต์ที่ส่งให้
loc[]ต้องมีลำดับคอลัมน์ตรงกับ DataFrame - การใช้ในลูปหลายรอบ:
for row in rows: df.loc[len(df)] = rowช้า (copy ทุกรอบ) - Best practice: สะสม rows ใน list → สร้าง DataFrame ครั้งเดียว
Best Practice สำหรับหลายแถว
# ❌ ช้า: ใช้ loc ในลูป
for row in new_rows:
df.loc[len(df)] = row
# ✅ เร็ว: สะสมในลิสต์ แล้ว concat ครั้งเดียว
new_df = pd.DataFrame(new_rows, columns=df.columns)
df = pd.concat([df, new_df], ignore_index=True)
# ✅ เร็วที่สุด: สร้าง DataFrame ครั้งเดียวตั้งแต่แรก
all_rows = original_rows + new_rows
df = pd.DataFrame(all_rows, columns=['Country', 'Rank', 'Points'])
สรุป
ใช้ df.loc[len(df)] = row เพิ่มแถวเดี่ยว แทน append() ที่ deprecated สำหรับหลายแถว ใช้ pd.concat() หรือสะสมในลิสต์ก่อนสร้าง DataFrame ครั้งเดียว