DataFrame
คืนเป็น DataFrame ก้อนใหม่ที่แทนค่าเรียบร้อยแล้วครับ ตัวเดิมไม่ถูกแก้ ผมเลยต้องรับค่ากลับด้วย df = df.replace(…) ถึงจะเก็บผลไว้ใช้ต่อได้
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| to_replace | scalar | list | dict | ค่าที่ต้องการค้นหาเพื่อแทนที่ ใส่ได้ทั้งค่าเดียว เช่น 0, list ของหลายค่า เช่น [‘na’,’NA’] หรือ dict ที่จับคู่ค่าเก่า→ค่าใหม่ เช่น {‘M’:’ชาย’,’F’:’หญิง’} | |
| [value]ไม่บังคับ | scalar | list | None | ค่าใหม่ที่จะนำไปแทน ถ้า to_replace เป็น dict อยู่แล้วไม่ต้องใส่ value เพราะระบุค่าใหม่ไว้ใน dict แล้ว |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
ตอนผมต้องล้างข้อมูลก่อนเอาไปวิเคราะห์ replace คือเครื่องมือที่หยิบมาใช้บ่อยมากครับ 😎
หน้าที่ของมันตรงไปตรงมาเลย: หาค่าที่เราระบุ แล้วแทนด้วยค่าใหม่ เหมือนกด Ctrl+H ใน Excel เป๊ะ ต่างกันแค่เราสั่งผ่านโค้ดเลยทำซ้ำกับไฟล์ใหม่ๆ ได้ทุกวันโดยไม่ต้องมานั่งคลิกเอง
ที่เจ๋งคือ replace ยืดหยุ่นมาก แทนได้ทั้งทีละค่า แทนหลายค่าพร้อมกันด้วย dict (เช่น {‘M’:’ชาย’,’F’:’หญิง’}) หรือแทน list ของค่าหลายๆ ตัวให้กลายเป็นค่าเดียว สั่งรวดเดียวจบ ไม่ต้องเขียนทีละบรรทัด ✨
ส่วนตัวผมใช้มันแก้พวกข้อมูลที่พิมพ์ไม่เหมือนกัน เช่น ‘N/A’, ‘na’, ‘NA’ ที่จริงหมายถึงค่าว่างเหมือนกันหมด ก็ replace ให้เป็นมาตรฐานเดียวก่อนวิเคราะห์ต่อครับ
ผมแทนเลข 0 ในตารางทั้งหมดให้กลายเป็น 50 ครับ เหมือนเปิด Find & Replace ใน Excel แล้วพิมพ์ค้นหา 0 แทนด้วย 50 แล้วกด Replace All เลย — replace จะไล่ดูทุกคอลัมน์ให้เอง
คราวนี้ผมส่ง dict เข้าไป จับคู่ค่าเก่า→ค่าใหม่หลายตัวรวดเดียวครับ M กลายเป็น 'ชาย' และ F กลายเป็น 'หญิง' พร้อมกัน ไม่ต้องเรียก replace ซ้ำหลายรอบ แบบนี้ผมใช้บ่อยสุดเวลาแปลงรหัสย่อให้เป็นข้อความเต็ม
ปัญหาคลาสสิกของข้อมูลจริงครับ ค่าว่างถูกพิมพ์มาหลายแบบทั้ง 'na' และ 'NA' ผมเลยส่ง list ของค่าที่อยากเก็บกวาด แล้วแทนด้วยค่ามาตรฐานเดียวคือ 'ไม่ระบุ' ทำให้ข้อมูลสะอาดเป็นมาตรฐานก่อนเอาไปวิเคราะห์ต่อ
ต่างกันตรงระดับที่ทำงานครับ df.replace() จับคู่ทั้งค่า (whole value) เช่น ช่องที่เป็น 'NA' ทั้งช่องถึงจะถูกแทน ส่วน str.replace() แทน substring ภายในข้อความ เช่น เปลี่ยน 'กทม' ที่ฝังอยู่ในคำว่า 'กทม.มหานคร' ได้ ส่วนตัวผมใช้ df.replace ตอนแทนทั้งค่า และใช้ str.replace ตอนอยากแก้แค่บางส่วนของข้อความครับ
ไม่ครับ โดย default replace จะคืน DataFrame ก้อนใหม่ออกมา ตัวเดิมไม่ถูกแตะ ผมเลยต้องรับค่ากลับด้วย df = df.replace(…) เสมอ ไม่งั้นผลจะหายไปเฉยๆ ส่วน argument inplace=True ที่เคยใช้แก้ในตัวเดิมนั้น pandas รุ่นใหม่เริ่มไม่แนะนำแล้ว ผมเลยรับค่ากลับเองดีกว่าครับ ปลอดภัยกว่าเยอะ
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas replace จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
astype ใน pandas ผมใช้สำหรับแปลงประเภทข้อมูล (dtype) ของคอลัมน์หรือ DataFrame เช่น จาก object เป็น int หรือ float เป็น str ทำให้คำนวณได้ถูกต้องและประหยัด memory มากขึ้นครับ
pandas .str accessor ทำให้ผมใช้ text functions อย่าง upper, replace, contains กับทุกแถวในคอลัมน์พร้อมกันบรรทัดเดียว เหมือนได้ UPPER/SUBSTITUTE/SEARCH ของ Excel แต่ไม่ต้องลากสูตรทีละเซลล์ครับ
df.fillna() ใน pandas ผมใช้สำหรับเติมค่า NaN ที่หายไปใน DataFrame ด้วยค่าที่กำหนด เช่น 0, ค่าเฉลี่ย หรือค่าจากแถวก่อนหน้า เป็นขั้นตอนสำคัญในการทำความสะอาดข้อมูลก่อนวิเคราะห์หรือส่งเข้า model ครับ
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่