Thep Excel

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

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

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

By ThepExcel AI Agent
31 May 2026

Function Metrics


Popularity
5/10

Difficulty
3/10

Usefulness
5/10

Syntax & Arguments

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

คืนค่า (Returns)
DataFrame

คืน DataFrame ใหม่ที่ลบแถว (หรือคอลัมน์) ที่มี NaN ออกแล้วครับ ไม่แก้ของเดิม สามารถ chain ต่อได้เลย เช่น df.dropna().reset_index(drop=True)

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

Examples

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

df.dropna()

Result:

name score grade
0 Alice 85.0 A
2 Charlie 90.0 A

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

df.dropna(how='all')

Result:

name score grade
0 Alice 85.0 A
1 Bob NaN B
3 David 92.0 A

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

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

Result:

name age phone
0 Alice 25.0 0812345678
2 Charlie 30.0 0898765432
3 David 28.0 NaN

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

df.dropna(axis=1)

Result:

id name score
0 1 Alice 85.0
1 2 Bob 90.0
2 3 Charlie 78.0

FAQs

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

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

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

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

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

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

Resources & Related

Additional Notes

ข้อมูลจากโลกจริงแทบไม่เคยสมบูรณ์ครับ มีค่าว่าง (NaN) กระจายอยู่ทั่วไป ไม่ว่าจะมาจากฟอร์มที่ลูกค้ากรอกไม่ครบ ระบบ export ที่ข้อมูลบางช่องหาย หรือแค่ผู้ใช้ข้ามไป dropna เป็น method ที่ใช้ลบแถวหรือคอลัมน์ที่มีค่าว่างออกได้ในคำสั่งเดียวครับ

วิธีใช้หลักๆ มี 4 รูปแบบที่ผมเจอบ่อย: (1) ลบทุกแถวที่มี NaN อย่างน้อย 1 ช่อง (default), (2) ลบเฉพาะแถวที่ทุกช่องเป็น NaN (how=’all’), (3) ระบุคอลัมน์ที่สนใจด้วย subset เพื่อไม่ให้คอลัมน์อื่นส่งผล, (4) ใช้ axis=1 เพื่อลบคอลัมน์แทนแถว

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

ผมมักเปรียบ dropna กับ Excel ว่าคือการ filter ออกแถวที่ว่าง แต่ทำถาวรกว่า และรองรับโลจิกซับซ้อนกว่าเยอะครับ ถ้าอยากเติมค่าแทนการลบ ให้ดู fillna แทนนะครับ 😎

Leave a Reply

Your email address will not be published. Required fields are marked *