drop_duplicates ใน pandas ผมใช้สำหรับลบแถวข้อมูลที่ซ้ำกันออกจาก DataFrame เหมือนกับปุ่ม Remove Duplicates ใน Excel เลยครับ แต่ยืดหยุ่นกว่าตรงที่เราเลือกได้ว่าจะดูซ้ำจากคอลัมน์ไหน และจะเก็บแถวแรกหรือแถวสุดท้ายไว้
df.drop_duplicates(subset, keep)
df.drop_duplicates(subset, keep)
DataFrame
คืน DataFrame ใหม่ที่ลบแถวซ้ำออกแล้วครับ ต่อ method อื่นได้เลยเช่น .reset_index(drop=True) ถ้าอยากให้ index เรียงใหม่ตั้งแต่ 0
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| subset | str | list | None | Optional | None | ชื่อคอลัมน์ที่ใช้ตรวจสอบความซ้ำ ถ้าไม่ระบุจะดูทุกคอลัมน์ เช่น ’email’ หรือ [‘first_name’, ‘last_name’] |
| keep | str | Optional | 'first' | แถวไหนที่จะเก็บไว้เมื่อพบซ้ำ: ‘first’ เก็บแถวแรก, ‘last’ เก็บแถวสุดท้าย, False ลบซ้ำทั้งหมดทิ้ง |
df.drop_duplicates()df.drop_duplicates()
name dept salary
0 สมชาย IT 50000
1 สมหญิง HR 60000
3 วิชัย HR 70000
df.drop_duplicates(subset=['customer_id'])df.drop_duplicates(subset=['customer_id'])
customer_id name email
0 1 Alice a@test.com
1 2 Bob b@test.com
3 3 Charlie c@test.com
df.drop_duplicates(subset=['customer_id'], keep='last')df.drop_duplicates(subset=['customer_id'], keep='last')
customer_id name updated_at
1 2 Bob 2024-01-02
2 1 Alice Updated 2024-03-15
3 3 Charlie 2024-01-03
df.drop_duplicates(ignore_index=True)df.drop_duplicates(ignore_index=True)
order_id product amount
0 101 A 500
1 102 B 300
2 103 C 700
3 104 D 200
คืน DataFrame ใหม่เสมอครับ DataFrame เดิมไม่เปลี่ยน ถ้าอยากให้ตัวแปรเดิมอัปเดต ต้องรับกลับเองเช่น df = df.drop_duplicates() ผมชอบแบบนี้มากกว่า inplace=True เพราะ debug ง่ายกว่า ย้อนดูข้อมูลเดิมได้ตลอดครับ
คล้ายกันมากครับ แต่ pandas ยืดหยุ่นกว่าใน 2 เรื่องหลัก คือ (1) เลือกได้ว่าจะเก็บแถวแรกหรือแถวสุดท้ายด้วย keep — Excel เก็บแถวแรกเสมอ และ (2) ไม่แก้ไขข้อมูลเดิม ได้ DataFrame ใหม่กลับมา ทำให้ใช้ใน data pipeline ได้โดยไม่กลัวข้อมูลต้นฉบับเสียหายครับ
ใช้ keep=False ครับ เช่น df.drop_duplicates(subset=[‘customer_id’], keep=False) จะลบทุกแถวที่มี customer_id ซ้ำออกหมดเลย ไม่เหลือแม้แต่แถวแรก ผมใช้ตอนอยากเอาเฉพาะ record ที่ไม่มีการซ้ำกันเลย เช่น งาน deduplication ที่ strict มากๆ
ปัญหาข้อมูลซ้ำนี่ผมเจอแทบทุกโปรเจกต์เลยครับ 😎 ไม่ว่าจะเป็นข้อมูลที่ join มาจากหลายตาราง หรือ import มาจากหลาย file รวมกัน มักจะมีแถวซ้ำแฝงอยู่เสมอ
drop_duplicates ทำงานง่ายมากครับ มันสแกนทุกแถวและเปรียบเทียบค่าในคอลัมน์ที่เราระบุ ถ้าพบว่าซ้ำกัน ก็จะเอาออก เหลือไว้แค่แถวเดียว โดย default จะเก็บแถวแรกที่เจอ (keep=’first’) และดูทุกคอลัมน์ในการเปรียบเทียบ
ที่เจ๋งคือ parameter subset ครับ — ผมใช้บ่อยมากตอนอยากดูซ้ำแค่บางคอลัมน์ เช่น ถ้ามีข้อมูลลูกค้าที่ customer_id ซ้ำกัน แต่ email ต่างกัน ก็ใช้ subset=[‘customer_id’] เพื่อดึงแถวเฉพาะ customer_id ที่ไม่ซ้ำออกมาได้เลย ไม่ต้องสนใจว่าคอลัมน์อื่นต่างกันหรือเปล่า
ส่วนตัวผมชอบตัวนี้มากกว่า Excel Remove Duplicates ตรงที่มัน return DataFrame ใหม่ให้เลย ข้อมูลเดิมไม่หาย ทำให้ pipeline ยาวๆ ไม่มีผลข้างเคียงครับ