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

Python Pandas - สร้าง Subset เก็บเฉพาะรายการสุดท้ายจากค่าซ้ำด้วย drop_duplicates keep=last

เมธอด drop_duplicates() พร้อมพารามิเตอร์ keep='last' และ subset ใช้สร้าง Subset ที่เก็บเฉพาะ **รายการสุดท้าย (last occurrence)** ของค่าซ้ำ ตามคอลัมน์ที่ระบุ

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

1. สร้าง DataFrame มีค่าซ้ำใน Car และ Place

import pandas as pd

dataFrame = pd.DataFrame({
    'Car': ['BMW', 'Mercedes', 'Lamborghini', 'BMW', 'Mercedes', 'Porsche'],
    'Place': ['Delhi', 'Hyderabad', 'Chandigarh', 'Delhi', 'Hyderabad', 'Mumbai'],
    'UnitsSold': [85, 70, 80, 95, 55, 90]
})

2. ลบซ้ำ เก็บเฉพาะรายการสุดท้าย ตาม subset Car+Place

dataFrame2 = dataFrame.drop_duplicates(
    subset=['Car', 'Place'],
    keep='last'
).reset_index(drop=True)

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

import pandas as pd

dataFrame = pd.DataFrame({
    'Car': ['BMW', 'Mercedes', 'Lamborghini', 'BMW', 'Mercedes', 'Porsche'],
    'Place': ['Delhi', 'Hyderabad', 'Chandigarh', 'Delhi', 'Hyderabad', 'Mumbai'],
    'UnitsSold': [85, 70, 80, 95, 55, 90]
})
print("DataFrame:\n", dataFrame)

# ลบซ้ำ เก็บ last ตาม Car+Place
dataFrame2 = dataFrame.drop_duplicates(
    subset=['Car', 'Place'],
    keep='last'
).reset_index(drop=True)

print("\nUpdated DataFrame (keep last):\n", dataFrame2)

ผลลัพธ์

DataFrame:
        Car      Place  UnitsSold
0      BMW     Delhi         85
1  Mercedes Hyderabad         70
2 Lamborghini Chandigarh         80
3      BMW     Delhi         95
4  Mercedes Hyderabad         55
5   Porsche    Mumbai         90

Updated DataFrame (keep last):
        Car      Place  UnitsSold
0 Lamborghini Chandigarh         80
1      BMW     Delhi         95
2  Mercedes Hyderabad         55
3   Porsche    Mumbai         90

คำอธิบาย

  • subset=['Car', 'Place']: ถือว่าซ้ำก็ต่อเมื่อ **ทั้งคู่** เหมือนกัน
  • keep='last': เก็บแถวสุดท้ายที่พบ ลบแถวก่อนหน้าที่ซ้ำ
  • keep='first' (default): เก็บแถวแรก ลบแถวหลังที่ซ้ำ
  • keep=False: ลบแถวที่ซ้ำทั้งหมด (เก็บเฉพาะ unique rows)
  • reset_index(drop=True): รีเซ็ต index ใหม่ 0,1,2... ไม่เก็บ index เดิม

ตัวอย่าง keep อื่นๆ

# เก็บแถวแรก (default)
df.drop_duplicates(subset=['Car', 'Place'], keep='first')

# ลบซ้ำทั้งหมด (เก็บเฉพาะ unique)
df.drop_duplicates(subset=['Car', 'Place'], keep=False)

# ลบซ้ำทุกคอลัมน์ (ไม่ระบุ subset)
df.drop_duplicates(keep='last')

ประสิทธิภาพ

  • ใช้ hash-based algorithm เร็วมาก
  • DataFrame ใหญ่: ใช้ df.duplicated(subset=..., keep='last') สร้าง mask แล้ว df[~mask] ควบคุม memory ได้ดีกว่า
  • inplace=True ไม่คืนค่า แก้ไข DataFrame เดิม (ไม่แนะนำ)