df.fillna() ใน pandas ผมใช้สำหรับเติมค่า NaN ที่หายไปใน DataFrame ด้วยค่าที่กำหนด เช่น 0, ค่าเฉลี่ย หรือค่าจากแถวก่อนหน้า เป็นขั้นตอนสำคัญในการทำความสะอาดข้อมูลก่อนวิเคราะห์หรือส่งเข้า model ครับ
df.fillna(value)
df.fillna(value)
DataFrame
คืนเป็น DataFrame ใหม่ที่เติมค่า NaN แล้วครับ DataFrame ต้นฉบับไม่เปลี่ยน (เว้นแต่ใส่ inplace=True) ผมแนะนำให้เก็บในตัวแปรใหม่เสมอ เช่น df_clean = df.fillna(0)
| Argument | Type | Required | Default | Description |
|---|---|---|---|---|
| value | scalar | dict | Series | DataFrame | Yes | ค่าที่จะใช้เติมแทน NaN เช่น 0, ‘Unknown’, หรือ dict เช่น {‘col1’: 0, ‘col2’: ‘N/A’} สำหรับกำหนดต่างคอลัมน์ | |
| method | str | None | Optional | None | วิธีเติม: ‘ffill’ (forward fill — ใช้ค่าแถวก่อนหน้า) หรือ ‘bfill’ (backward fill — ใช้ค่าแถวถัดไป) แทน value |
| inplace | bool | Optional | False | ถ้า True จะแก้ไข DataFrame ต้นฉบับเลย ไม่คืน DataFrame ใหม่ ผมแนะนำให้ใช้ False แล้วเก็บผลลัพธ์ในตัวแปรใหม่ครับ |
| limit | int | None | Optional | None | จำกัดจำนวนแถว NaN ติดกันที่จะเติม เช่น limit=1 เติมได้แค่ 1 NaN ต่อกัน ใช้คู่กับ method |
df.fillna(0)df.fillna(0)
score name
0 85.0 Ana
1 0.0 Bob
2 90.0 Cara
3 0.0 Dan
4 75.0 Eva
df.fillna({'score': 0, 'city': 'Unknown'})df.fillna({'score': 0, 'city': 'Unknown'})
score city
0 85.0 Bangkok
1 0.0 Unknown
2 90.0 Phuket
df.ffill()df.ffill()
temp
0 36.5
1 36.5
2 36.5
3 37.0
4 37.0
ไม่เปลี่ยนครับถ้าไม่ได้ใส่ inplace=True ผลลัพธ์จะเป็น DataFrame ใหม่ ต้องรับด้วยตัวแปร เช่น df_clean = df.fillna(0) ผมแนะนำให้ทำแบบนี้เสมอเพื่อเก็บข้อมูลต้นฉบับไว้ตรวจสอบ
ใช้ df.fillna(df.mean()) ได้เลยครับ pandas จะคำนวณ mean ของแต่ละคอลัมน์แล้วเติม NaN ในคอลัมน์นั้นอัตโนมัติ ผมใช้วิธีนี้บ่อยสำหรับข้อมูลตัวเลขที่ไม่ต้องการ bias จากการเติม 0
df.fillna() คือเครื่องมือทำความสะอาดข้อมูลที่ผมใช้บ่อยที่สุดตัวหนึ่งเลยครับ 😎
ฟังก์ชันนี้แทนค่า NaN (Not a Number — ค่าที่หายไปใน pandas) ด้วยค่าที่เรากำหนด ไม่ว่าจะเป็นตัวเลขคงที่ เช่น 0 หรือ ‘Unknown’, ค่าที่คำนวณได้เช่น mean, หรือค่าจากแถวติดกัน (forward fill / backward fill) และทำงานได้ทั้งระดับ DataFrame ทั้งก้อนหรือระบุรายคอลัมน์ก็ได้
ที่เจ๋งคือส่ง dict เข้าไปเพื่อกำหนดค่าเติมแต่ละคอลัมน์ต่างกันได้ในคำสั่งเดียว เช่น {‘age’: 0, ‘city’: ‘Unknown’} ประหยัดการเขียน fillna หลายรอบมากครับ ✨
ส่วนตัวผมมักเช็คก่อนเสมอด้วย df.isnull().sum() เพื่อรู้ว่าคอลัมน์ไหนมี NaN กี่ค่า แล้วค่อยตัดสินใจว่าจะเติมอะไร บางทีเติม 0 ไม่เหมาะ ควรเติม mean หรือ median แทนครับ