Thep Excel

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

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

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

ความนิยม5/10
ความยาก3/10
ประโยชน์5/10

อัปเดต 31 May 2026

Syntax & Arguments

คืนค่าDataFrame

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

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

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

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 แทนนะครับ 😎

Examples

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

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

>_
df.dropna()

ผลลัพธ์ 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 มาแล้วมีแถวว่างพิเศษขั้น

>_
df.dropna(how='all')

ผลลัพธ์ name score grade
0 Alice 85.0 A
1 Bob NaN B
3 David 92.0 A
ตัวอย่างที่ 3: ตรวจสอบเฉพาะบางคอลัมน์ด้วย subsetdf.dropna(subset=['name', 'age'])

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

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

ผลลัพธ์ 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 มาจากหลายแหล่งแล้วมีคอลัมน์ที่ไม่มีข้อมูลเลยปนอยู่

>_
df.dropna(axis=1)

ผลลัพธ์ 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

ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas dropna จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้pandas dropnaCleaning
Cleaning (3)
pandas drop_duplicates

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

pandas fillna

df.fillna() ใน pandas ผมใช้สำหรับเติมค่า NaN ที่หายไปใน DataFrame ด้วยค่าที่กำหนด เช่น 0, ค่าเฉลี่ย หรือค่าจากแถวก่อนหน้า เป็นขั้นตอนสำคัญในการทำความสะอาดข้อมูลก่อนวิเคราะห์หรือส่งเข้า model ครับ

pandas isna

isna ใน pandas ผมใช้สำหรับเช็คว่าแต่ละช่องใน DataFrame มีค่าว่าง (NaN) อยู่หรือเปล่า คืนผลเป็น True/False ทุกช่อง เหมือน ISBLANK ใน Excel เลยครับ แต่ทำได้กับทั้งตารางพร้อมกันในคำสั่งเดียว

Aggregation (1)
pandas count

df.count() ผมใช้นับจำนวนค่าที่ "มีข้อมูลจริง" ในแต่ละคอลัมน์ โดยข้ามช่องที่เป็นค่าว่าง (NaN/None) ไปให้อัตโนมัติ ถ้าใครคุ้นกับ COUNTA ใน Excel ที่นับเฉพาะช่องที่มีข้อมูล บอกเลยว่าตัวนี้คือพี่น้องกันเลยครับ

Transform (1)
pandas drop

drop ใน pandas ผมใช้สำหรับตัดคอลัมน์หรือแถวที่ไม่ต้องการออกจาก DataFrame โดยระบุชื่อเองโดยตรง เหมือนการ "ลบคอลัมน์" ใน Excel แบบเลือกได้เป๊ะๆ ว่าจะเอาคอลัมน์ไหนออกครับ

Selection (1)
pandas query

query ใน pandas ผมใช้กรองแถวใน DataFrame ด้วยข้อความเงื่อนไขที่อ่านง่ายเหมือนพูดภาษาคน แทนที่จะเขียน boolean mask ยาวๆ ให้ตาลาย เหมาะมากกับเงื่อนไขซับซ้อนหลายข้อที่อยากให้โค้ดสั้นและอ่านรู้เรื่องครับ

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่