DataFrame
คืนเป็น DataFrame ใหม่ที่เติมค่า NaN แล้วครับ DataFrame ต้นฉบับไม่เปลี่ยน (เว้นแต่ใส่ inplace=True) ผมแนะนำให้เก็บในตัวแปรใหม่เสมอ เช่น df_clean = df.fillna(0)
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| value | scalar | dict | Series | DataFrame | ค่าที่จะใช้เติมแทน NaN เช่น 0, ‘Unknown’, หรือ dict เช่น {‘col1’: 0, ‘col2’: ‘N/A’} สำหรับกำหนดต่างคอลัมน์ | |
| [method]ไม่บังคับ | str | None | None | วิธีเติม: ‘ffill’ (forward fill — ใช้ค่าแถวก่อนหน้า) หรือ ‘bfill’ (backward fill — ใช้ค่าแถวถัดไป) แทน value |
| [inplace]ไม่บังคับ | bool | False | ถ้า True จะแก้ไข DataFrame ต้นฉบับเลย ไม่คืน DataFrame ใหม่ ผมแนะนำให้ใช้ False แล้วเก็บผลลัพธ์ในตัวแปรใหม่ครับ |
| [limit]ไม่บังคับ | int | None | None | จำกัดจำนวนแถว NaN ติดกันที่จะเติม เช่น limit=1 เติมได้แค่ 1 NaN ต่อกัน ใช้คู่กับ method |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
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 แทนครับ
ผมเติม NaN ในคอลัมน์ score ด้วย 0 ครับ ง่ายที่สุดเมื่อค่า 0 มีความหมายในบริบทนั้น เช่น คะแนนที่ขาดส่งถือว่าได้ 0
คราวนี้ผมส่ง dict เพื่อกำหนดค่าเติมแต่ละคอลัมน์ต่างกันครับ score ที่หายไปเติม 0, city ที่หายไปเติม 'Unknown' จบในบรรทัดเดียวเลย
ใช้ df.ffill() เพื่อเติม NaN ด้วยค่าจากแถวก่อนหน้าครับ (pandas 3.x ใช้ .ffill() แทน fillna(method='ffill') แล้ว) NaN ตัวที่ 2 และ 3 จะกลายเป็น 36.5 เหมือนแถวบน เหมาะกับข้อมูล time series ที่ค่าไม่น่าจะเปลี่ยนแบบกระทันหัน
ไม่เปลี่ยนครับถ้าไม่ได้ใส่ inplace=True ผลลัพธ์จะเป็น DataFrame ใหม่ ต้องรับด้วยตัวแปร เช่น df_clean = df.fillna(0) ผมแนะนำให้ทำแบบนี้เสมอเพื่อเก็บข้อมูลต้นฉบับไว้ตรวจสอบ
ใช้ df.fillna(df.mean()) ได้เลยครับ pandas จะคำนวณ mean ของแต่ละคอลัมน์แล้วเติม NaN ในคอลัมน์นั้นอัตโนมัติ ผมใช้วิธีนี้บ่อยสำหรับข้อมูลตัวเลขที่ไม่ต้องการ bias จากการเติม 0
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas fillna จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
dropna ใน pandas ผมใช้สำหรับกำจัดแถวหรือคอลัมน์ที่มีค่า NaN ออกจาก DataFrame ครับ เหมาะมากสำหรับขั้นตอนทำความสะอาดข้อมูลก่อนวิเคราะห์ เพราะค่า NaN แฝงอยู่ในข้อมูลจริงแทบทุกชุด
isna ใน pandas ผมใช้สำหรับเช็คว่าแต่ละช่องใน DataFrame มีค่าว่าง (NaN) อยู่หรือเปล่า คืนผลเป็น True/False ทุกช่อง เหมือน ISBLANK ใน Excel เลยครับ แต่ทำได้กับทั้งตารางพร้อมกันในคำสั่งเดียว
replace ใน pandas ผมใช้สำหรับแทนที่ค่าหนึ่งด้วยอีกค่าหนึ่งทั้ง DataFrame หรือ Series เหมาะกับงาน cleaning ข้อมูล ใครเคยใช้ Find & Replace (Ctrl+H) ใน Excel มาก่อน บอกเลยว่าตัวนี้คือพี่น้องกันเลยครับ
astype ใน pandas ผมใช้สำหรับแปลงประเภทข้อมูล (dtype) ของคอลัมน์หรือ DataFrame เช่น จาก object เป็น int หรือ float เป็น str ทำให้คำนวณได้ถูกต้องและประหยัด memory มากขึ้นครับ
df.sort_values() ใน pandas ผมใช้สำหรับเรียงลำดับแถวใน DataFrame ตามค่าของคอลัมน์ที่กำหนด เรียงจากน้อยไปมากหรือมากไปน้อยก็ได้ และยังเรียงตามหลายคอลัมน์พร้อมกันได้ด้วยครับ
df.describe() ใน pandas ผมใช้สำหรับดูสถิติพื้นฐานของข้อมูลในทุกคอลัมน์พร้อมกันในคำสั่งเดียว ทั้ง count, mean, std, min, max และ percentile ช่วยให้เข้าใจภาพรวมของชุดข้อมูลได้เร็วมากก่อนเริ่มวิเคราะห์จริงครับ
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่