---
title: pandas drop_duplicates — ลบแถวซ้ำออกจาก DataFrame
url: https://www.thepexcel.com/functions/python/cleaning/pandas-drop-duplicates/
type: function-explainer
program: Python
syntax: "df.drop_duplicates(subset, keep)"
date: 2026-05-31
scores:
  popularity: 5
  difficulty: 3
  usefulness: 5
---

# pandas drop_duplicates — ลบแถวซ้ำออกจาก DataFrame

> drop_duplicates ใน pandas ผมใช้สำหรับลบแถวข้อมูลที่ซ้ำกันออกจาก DataFrame เหมือนกับปุ่ม Remove Dupli

## คำอธิบาย

drop_duplicates ใน pandas ผมใช้สำหรับลบแถวข้อมูลที่ซ้ำกันออกจาก DataFrame เหมือนกับปุ่ม Remove Duplicates ใน Excel เลยครับ แต่ยืดหยุ่นกว่าตรงที่เราเลือกได้ว่าจะดูซ้ำจากคอลัมน์ไหน และจะเก็บแถวแรกหรือแถวสุดท้ายไว้

## Syntax

```excel
df.drop_duplicates(subset, keep)
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| subset | No | str \| list \| None | None | ชื่อคอลัมน์ที่ใช้ตรวจสอบความซ้ำ ถ้าไม่ระบุจะดูทุกคอลัมน์ เช่น 'email' หรือ ['first_name', 'last_name'] |
| keep | No | str | 'first' | แถวไหนที่จะเก็บไว้เมื่อพบซ้ำ: 'first' เก็บแถวแรก, 'last' เก็บแถวสุดท้าย, False ลบซ้ำทั้งหมดทิ้ง |

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: ลบแถวที่ซ้ำกันทุกคอลัมน์

```excel
df.drop_duplicates()
```

**ผลลัพธ์:** `     name dept  salary
0   สมชาย   IT   50000
1  สมหญิง   HR   60000
3   วิชัย   HR   70000`

ผมมีข้อมูลพนักงาน 4 แถว แต่แถวที่ 1 กับแถว 3 ซ้ำกันทุกคอลัมน์ (สมชาย-IT-50000) drop_duplicates() จะลบแถว 3 ออก เหลือ 3 แถวที่ไม่ซ้ำกันครับ ง่ายมากเลย

### 2. ตัวอย่างที่ 2: ดูซ้ำเฉพาะคอลัมน์ที่ระบุ (subset)

```excel
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`

อันนี้คือ use case ที่ผมใช้บ่อยที่สุดครับ ลูกค้า ID=1 มีอยู่ 2 แถว แต่ข้อมูลต่างกัน (อาจเป็นการ update ชื่อและ email) subset=['customer_id'] บอกให้ดูซ้ำแค่คอลัมน์ customer_id เท่านั้น ผลคือเก็บแถวแรกของ ID=1 ไว้ แถวที่ 3 จะถูกลบออก แม้ว่า name กับ email ต่างกันก็ตาม

### 3. ตัวอย่างที่ 3: เก็บแถวสุดท้ายที่ซ้ำกัน (keep='last')

```excel
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`

คราวนี้ผมเปลี่ยนเป็น keep='last' ครับ ซึ่งหมายความว่าถ้า customer_id ซ้ำกัน จะเก็บแถวหลังสุดไว้ นั่นคือข้อมูลล่าสุดของลูกค้า ID=1 คือ 'Alice Updated' ที่อัปเดตวันที่ 2024-03-15 เหมาะมากตอนอยากได้ข้อมูลล่าสุดของแต่ละ record ครับ

### 4. ตัวอย่างที่ 4: ตรวจสอบว่าลบไปกี่แถว

```excel
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`

ผมมี order_id 6 แถว มีซ้ำกัน 2 คู่ (101 กับ 102) หลัง drop_duplicates() จะเหลือ 4 แถว ถ้าอยากรู้ว่าลบไปกี่แถว ใช้ len(df) - len(df.drop_duplicates()) ก็ได้ครับ สะดวกดีตอน QA ข้อมูล

## หมายเหตุเพิ่มเติม

- 💡 ผมแนะนำให้ตรวจสอบก่อน-หลังเสมอครับ ใช้ print(f'ก่อน: {len(df)} แถว, หลัง: {len(df.drop_duplicates())} แถว') จะเห็นทันทีว่ามีซ้ำกี่แถว ช่วยในการ QA ข้อมูลได้ดีมาก

- ส่วนตัวผมใช้ subset เกือบทุกครั้งที่ drop_duplicates ครับ เพราะในชีวิตจริง record มักมีคอลัมน์ timestamp หรือ id ที่ต่างกันแม้เนื้อหาเดียวกัน ถ้าไม่ระบุ subset มันจะไม่ตัดว่าซ้ำเพราะ id ต่างกัน ต้องระบุเฉพาะคอลัมน์ที่สำคัญเท่านั้น

## คำถามที่พบบ่อย

**Q: drop_duplicates แก้ไข DataFrame เดิมเลยไหม หรือคืนอันใหม่?**

คืน DataFrame ใหม่เสมอครับ DataFrame เดิมไม่เปลี่ยน ถ้าอยากให้ตัวแปรเดิมอัปเดต ต้องรับกลับเองเช่น df = df.drop_duplicates() ผมชอบแบบนี้มากกว่า inplace=True เพราะ debug ง่ายกว่า ย้อนดูข้อมูลเดิมได้ตลอดครับ

**Q: ต่างจาก Excel Remove Duplicates ยังไง?**

คล้ายกันมากครับ แต่ pandas ยืดหยุ่นกว่าใน 2 เรื่องหลัก คือ (1) เลือกได้ว่าจะเก็บแถวแรกหรือแถวสุดท้ายด้วย keep — Excel เก็บแถวแรกเสมอ และ (2) ไม่แก้ไขข้อมูลเดิม ได้ DataFrame ใหม่กลับมา ทำให้ใช้ใน data pipeline ได้โดยไม่กลัวข้อมูลต้นฉบับเสียหายครับ

**Q: ถ้าต้องการลบแถวที่ซ้ำทิ้งหมดเลย (ทั้งแถวแรกและแถวซ้ำ) ทำยังไง?**

ใช้ keep=False ครับ เช่น df.drop_duplicates(subset=['customer_id'], keep=False) จะลบทุกแถวที่มี customer_id ซ้ำออกหมดเลย ไม่เหลือแม้แต่แถวแรก ผมใช้ตอนอยากเอาเฉพาะ record ที่ไม่มีการซ้ำกันเลย เช่น งาน deduplication ที่ strict มากๆ

## แหล่งข้อมูลเพิ่มเติม

- [pandas drop_duplicates (official docs)](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop_duplicates.html) _(article)_

---

_Source: [https://www.thepexcel.com/functions/python/cleaning/pandas-drop-duplicates/](https://www.thepexcel.com/functions/python/cleaning/pandas-drop-duplicates/)_
