---
title: pandas dropna — ลบแถว (หรือคอลัมน์) ที่มีค่าว่างออกจาก DataFrame
url: https://www.thepexcel.com/functions/python/cleaning/pandas-dropna/
type: function-explainer
program: Python
syntax: "df.dropna(axis, how, subset, inplace)"
date: 2026-05-31
scores:
  popularity: 5
  difficulty: 3
  usefulness: 5
---

# pandas dropna — ลบแถว (หรือคอลัมน์) ที่มีค่าว่างออกจาก DataFrame

> dropna ใน pandas ผมใช้สำหรับกำจัดแถวหรือคอลัมน์ที่มีค่า NaN ออกจาก DataFrame ครับ เหมาะมากสำหรับขั้น

## คำอธิบาย

dropna ใน pandas ผมใช้สำหรับกำจัดแถวหรือคอลัมน์ที่มีค่า NaN ออกจาก DataFrame ครับ เหมาะมากสำหรับขั้นตอนทำความสะอาดข้อมูลก่อนวิเคราะห์ เพราะค่า NaN แฝงอยู่ในข้อมูลจริงแทบทุกชุด

## Syntax

```excel
df.dropna(axis, how, subset, inplace)
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| axis | No | int \| str | 0 | 0 หรือ 'index' = ลบแถว (default), 1 หรือ 'columns' = ลบคอลัมน์ที่มี NaN |
| how | No | str | 'any' | 'any' = ลบถ้ามี NaN อย่างน้อย 1 ช่อง (default), 'all' = ลบเฉพาะถ้าทุกช่องเป็น NaN |
| thresh | No | int | None | กำหนดจำนวนค่าที่ไม่ใช่ NaN ขั้นต่ำที่แถวต้องมี ถ้าต่ำกว่านี้จะถูกลบออก |
| subset | No | str \| list | None | ระบุชื่อคอลัมน์ที่จะตรวจสอบ NaN ถ้าไม่ระบุจะตรวจทุกคอลัมน์ |
| inplace | No | bool | False | True = แก้ไข DataFrame ตัวเดิม และคืนค่า None, False = คืน DataFrame ใหม่ (default) |

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: ลบทุกแถวที่มี NaN อย่างน้อย 1 ช่อง (default)

```excel
df.dropna()
```

**ผลลัพธ์:** `      name  score grade
0    Alice   85.0     A
2  Charlie   90.0     A`

ผมไม่ใส่ argument เพิ่มเลย dropna จะลบทุกแถวที่มีค่า NaN อย่างน้อย 1 ช่อง ผลลัพธ์เหลือแค่ Alice และ Charlie ที่ข้อมูลครบทุกช่องครับ เหมาะสำหรับกรณีที่ต้องการข้อมูลสมบูรณ์ 100% ก่อนนำไป train model หรือวิเคราะห์สถิติ

### 2. ตัวอย่างที่ 2: ลบเฉพาะแถวที่ทุกช่องเป็น NaN พร้อมกัน (how='all')

```excel
df.dropna(how='all')
```

**ผลลัพธ์:** `    name  score grade
0  Alice   85.0     A
1    Bob    NaN     B
3  David   92.0     A`

ตอนนี้ผมใช้ how='all' ครับ แถวที่ 3 (index 2) ที่ทุกช่องเป็น NaN หมดจะถูกลบออก แต่แถว Bob ที่มีแค่ score ว่างจะยังอยู่ มีประโยชน์มากตอนที่ข้อมูลมีแถว "เปล่า" แทรกอยู่ เช่น ดาวน์โหลด CSV มาแล้วมีแถวว่างพิเศษขั้น

### 3. ตัวอย่างที่ 3: ตรวจสอบเฉพาะบางคอลัมน์ด้วย subset

```excel
df.dropna(subset=['name', 'age'])
```

**ผลลัพธ์:** `      name   age       phone
0    Alice  25.0  0812345678
2  Charlie  30.0  0898765432
3    David  28.0         NaN`

ผมระบุ subset=['name', 'age'] เพื่อบอกว่าสนใจเฉพาะสองคอลัมน์นี้ครับ Bob ที่ age ว่างจะถูกลบ แต่ David ที่ phone ว่างอย่างเดียวจะยังอยู่ เพราะ name กับ age ครบ เหมาะมากตอนที่คอลัมน์บางตัวเป็น optional ไม่ควรไปลบแถวเพราะมันว่าง

### 4. ตัวอย่างที่ 4: ลบคอลัมน์ที่มี NaN แทนแถว (axis=1)

```excel
df.dropna(axis=1)
```

**ผลลัพธ์:** `   id     name  score
0   1    Alice   85.0
1   2      Bob   90.0
2   3  Charlie   78.0`

เปลี่ยน axis=1 ทำให้ dropna ลบคอลัมน์แทนแถวครับ คอลัมน์ notes ที่มีแต่ NaN ทุกแถวจะหายไป คอลัมน์อื่นยังอยู่ครบ ผมใช้แบบนี้ตอน DataFrame มาจากหลายแหล่งแล้วมีคอลัมน์ที่ไม่มีข้อมูลเลยปนอยู่

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

- 💡 ก่อน dropna ผมมักรัน df.isna().sum() ดูก่อนเสมอครับ เพื่อรู้ว่าแต่ละคอลัมน์มี NaN กี่แถว ได้ภาพรวมก่อนตัดสินใจว่าจะลบหรือเติมค่าแทน

- ถ้าอยากเก็บแถวที่ข้อมูลพอใช้ได้ ไม่จำเป็นต้องสมบูรณ์ 100% ลองใช้ thresh ครับ เช่น df.dropna(thresh=3) หมายถึงแถวต้องมีค่าที่ไม่ใช่ NaN อย่างน้อย 3 ตัว ถ้าน้อยกว่านั้นถึงจะลบออก ยืดหยุ่นกว่า how='all' มากครับ

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

**Q: dropna กับ fillna ต่างกันยังไง? จะเลือกใช้ตัวไหนดี?**

ต่างกันที่ strategy ครับ dropna คือ "ลบแถวที่มีปัญหาออกไปเลย" ส่วน fillna คือ "เติมค่าแทนตรงที่ว่าง" ผมเลือกแบบนี้ครับ: ถ้าข้อมูลว่างจริงๆ ไม่มีทางเดาได้ หรือแถวนั้นไม่มีประโยชน์เลย → ใช้ dropna แต่ถ้าพอเดาได้ เช่น เติม 0, เติม median, หรือ forward fill → ใช้ fillna เพราะข้อมูลมีค่า จะทิ้งไปดูสิ้นเปลือง

**Q: ลบแล้ว index เลขกระโดด จะ reset ยังไง?**

ต่อด้วย .reset_index(drop=True) ครับ เช่น df.dropna().reset_index(drop=True) ใส่ drop=True เพื่อไม่ให้ index เก่าไปเป็นคอลัมน์ใหม่ ผมทำแบบนี้ทุกครั้งก่อนส่ง DataFrame ต่อไปให้โค้ดอื่นครับ เพราะบางครั้ง index ที่กระโดดทำให้ .iloc[] กับ .loc[] ให้ผลต่างกันแบบที่ไม่ตั้งใจ

**Q: ใช้ inplace=True ดีกว่า df = df.dropna() ไหม?**

ผมแนะนำ df = df.dropna() มากกว่าครับ เพราะ inplace=True แก้ตัวแปรเดิมทันทีและคืน None ทำให้ถ้าเขียน df = df.dropna(inplace=True) จะได้ None กลับมาแทน ซึ่งงง มากๆ ครับ นอกจากนี้ pandas กำลังทำให้ inplace deprecated ในบางกรณี ฉะนั้นเขียน df = df.dropna() ปลอดภัยกว่าเยอะ

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

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

---

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