DataFrameต้อง chain ต่อ
คืน DataFrame ขนาดเท่าเดิมทุกช่องครับ แต่ค่าในแต่ละช่องจะเป็น True (ว่าง) หรือ False (มีค่า) — ถ้าเรียกบน Series คอลัมน์เดียวจะได้ Series ของ bool กลับมาแทน
ก่อนที่จะวิเคราะห์ข้อมูลจริงจัง สิ่งแรกที่ผมทำเสมอคือดูว่ามีช่องไหนข้อมูลหายไปบ้างครับ และ isna คือเครื่องมือที่ผมเปิดใช้เป็นอันดับแรกเลย
หลักการทำงานของมันง่ายมาก: isna วิ่งผ่านทุกช่องใน DataFrame แล้วถามว่า “ช่องนี้ว่างไหม?” ถ้าว่าง (NaN หรือ None) ได้ True ถ้ามีค่าได้ False — คืนออกมาเป็น DataFrame ขนาดเท่าเดิมทุกช่องเลยครับ Pattern ที่ผมใช้บ่อยที่สุดคือ df.isna().sum() ซึ่งจะนับจำนวนช่องว่างในแต่ละคอลัมน์ให้ครบในทีเดียว
ที่เจ๋งคือ isna ใช้ได้ทั้งระดับ DataFrame ทั้งหมด (df.isna()) และระดับคอลัมน์เดี่ยว (df[‘col’].isna()) ทำให้กรองเฉพาะแถวที่ข้อมูลครบหรือว่างได้ยืดหยุ่นมาก 🎯
ส่วนตัวผมถือว่า df.isna().sum() เป็น “ก้าวแรก” ของ EDA (Exploratory Data Analysis) ทุกครั้งเลยครับ รู้ว่าข้อมูลขาดตรงไหนก่อน แล้วค่อยตัดสินใจว่าจะ fillna เติม หรือ dropna ทิ้ง 😎
ผมสั่ง df.isna() เพื่อดูภาพรวมว่าทั้งตารางมีช่องว่างอยู่ที่ไหนบ้างครับ ได้ DataFrame ขนาดเท่าเดิมกลับมา ช่องไหนว่างจะเป็น True ช่องไหนมีข้อมูลจะเป็น False — เหมือนทำ ISBLANK ให้ทุกช่องพร้อมกันเลย
Pattern นี้คือที่ผมใช้บ่อยที่สุดเลยครับ — df.isna().sum() นับว่าแต่ละคอลัมน์มีค่าว่างกี่แถว ได้ออกมาเป็น Series สรุปให้เห็นภาพชัดเจนว่าคอลัมน์ไหนมีปัญหาข้อมูลหาย เหมือน COUNTBLANK ใน Excel แต่ทำทุกคอลัมน์พร้อมกันครับ
ผมใช้ df['name'].isna() เพื่อเช็คเฉพาะคอลัมน์ name ว่าแถวไหนว่างบ้าง แล้วเอาผลไปกรองเป็น boolean index เพื่อดูแถวที่มีชื่อหายไปครับ วิธีนี้ผมใช้ตอนต้องการ debug หรือ inspect แถวที่มีปัญหาโดยตรง
ผมต่อยอด pattern df.isna().sum() โดยหารด้วยจำนวนแถวทั้งหมดแล้วคูณ 100 ได้เปอร์เซ็นต์ข้อมูลหายในแต่ละคอลัมน์ครับ มีประโยชน์มากตอน QC ข้อมูล — ถ้าคอลัมน์ไหน missing เกิน 50% ผมมักตัดสินใจ drop คอลัมน์นั้นทิ้งเลย
notna คือ ตรงข้ามของ isna เลยครับ ถ้า isna คืน True ตรงช่องว่าง notna ก็คืน False ตรงนั้น ผมใช้ notna ตอนอยากกรองเฉพาะแถวที่ข้อมูลครบ เช่น df[df['score'].notna()] จะได้แถวที่ score ไม่ว่างทุกแถวครับ สะดวกกว่าเขียน ~df['score'].isna() มาก
ไม่ได้ครับ isna เช็คเฉพาะค่า NaN และ None เท่านั้น string เปล่า '' ถือว่ามีค่า (เป็น string ความยาว 0) isna จะคืน False ให้ ถ้าอยากเช็ค string เปล่าด้วยผมต้องเขียนเพิ่มเป็น (df['col'].isna()) | (df['col'] == '') ครับ
ใช้ได้ครับ แต่ผมมักใช้กับ DataFrame ธรรมดามากกว่า Pattern ที่เจอบ่อยคือเช็ค missing ก่อน groupby เพื่อให้รู้ว่าค่า NaN จะไปอยู่กลุ่มไหน (pandas จัดกลุ่ม NaN แยกต่างหากโดย default) ถ้าไม่อยากให้ NaN ติดมาด้วยต้อง dropna ก่อน groupby ครับ
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas isna จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
dropna ใน pandas ผมใช้สำหรับกำจัดแถวหรือคอลัมน์ที่มีค่า NaN ออกจาก DataFrame ครับ เหมาะมากสำหรับขั้นตอนทำความสะอาดข้อมูลก่อนวิเคราะห์ เพราะค่า NaN แฝงอยู่ในข้อมูลจริงแทบทุกชุด
df.fillna() ใน pandas ผมใช้สำหรับเติมค่า NaN ที่หายไปใน DataFrame ด้วยค่าที่กำหนด เช่น 0, ค่าเฉลี่ย หรือค่าจากแถวก่อนหน้า เป็นขั้นตอนสำคัญในการทำความสะอาดข้อมูลก่อนวิเคราะห์หรือส่งเข้า model ครับ
df.count() ผมใช้นับจำนวนค่าที่ "มีข้อมูลจริง" ในแต่ละคอลัมน์ โดยข้ามช่องที่เป็นค่าว่าง (NaN/None) ไปให้อัตโนมัติ ถ้าใครคุ้นกับ COUNTA ใน Excel ที่นับเฉพาะช่องที่มีข้อมูล บอกเลยว่าตัวนี้คือพี่น้องกันเลยครับ
query ใน pandas ผมใช้กรองแถวใน DataFrame ด้วยข้อความเงื่อนไขที่อ่านง่ายเหมือนพูดภาษาคน แทนที่จะเขียน boolean mask ยาวๆ ให้ตาลาย เหมาะมากกับเงื่อนไขซับซ้อนหลายข้อที่อยากให้โค้ดสั้นและอ่านรู้เรื่องครับ
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่