Series
ถ้าเรียกบน Series (df['col'].astype(…)) จะได้ Series กลับมาครับ ถ้าเรียกบน DataFrame ทั้งตาราง (df.astype(…)) จะได้ DataFrame กลับมา — ใน verify นี้ใช้ Series-returning snippet
| อาร์กิวเมนต์ | ชนิด | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|
| dtype | str | type | dict | dtype ที่อยากแปลงไป เช่น ‘int64’, float, str, ‘category’ หรือ dict {‘col1’: int, ‘col2’: float} สำหรับแปลงหลายคอลัมน์พร้อมกัน | |
| [errors]ไม่บังคับ | str | 'raise' | ‘raise’ (default) จะ raise exception ถ้าแปลงไม่ได้ / ‘ignore’ จะคืนค่าเดิมถ้าแปลงไม่ได้โดยไม่ error |
[ ] = อาร์กิวเมนต์ที่ไม่บังคับ
ปัญหาที่ผมเจอบ่อยมากตอนโหลดข้อมูลจาก CSV หรือ Excel คือคอลัมน์ตัวเลขดันเป็น object หรือ string ทำให้บวกลบไม่ได้ กราฟออกมาแปลกๆ หรือ groupby ให้ผลผิดพลาดครับ astype คือเครื่องมือที่แก้ปัญหานี้ได้ตรงๆ เลย — สั่งแปลง dtype ได้ทั้งทั้งคอลัมน์เดียว หลายคอลัมน์พร้อมกัน หรือทั้ง DataFrame
ที่เจ๋งคือ astype รับ dict เพื่อแปลงหลายคอลัมน์พร้อมกัน เช่น df.astype({‘age’: int, ‘score’: float}) ในบรรทัดเดียว ไม่ต้องวนเขียนทีละคอลัมน์ นอกจากนี้ยังแปลงเป็น ‘category’ ได้ ซึ่งช่วยประหยัด memory ได้มากในคอลัมน์ที่มีค่าซ้ำๆ เช่น จังหวัด แผนก หมวดหมู่สินค้า
ส่วนตัวผมแนะนำให้รัน df.dtypes ดูก่อนเสมอเลยครับ จะได้รู้ว่าคอลัมน์ไหนยังมี dtype ผิดอยู่ แล้วค่อยใช้ astype แก้ให้ถูกก่อนเริ่มวิเคราะห์จริงๆ 😎
ผมโหลดข้อมูลมาแล้วคอลัมน์ age เป็น string ('25', '30') ไม่ใช่ตัวเลขจริงๆ พอใช้ astype(int) มันจะแปลงทุกค่าให้กลายเป็น integer ใช้คำนวณได้เลยครับ เทียบกับ Excel เหมือนตอนที่ตัวเลขอยู่ในเซลล์ text แล้วเราต้องแปลงกลับเป็นตัวเลขนั่นแหละ
คอลัมน์ price เริ่มต้นเป็น int แต่ผมอยากเป็น float เพื่อรองรับทศนิยมเวลาคำนวณส่วนลดหรือภาษีครับ astype(float) แปลงได้ทันที ค่า 100 กลายเป็น 100.0
อันนี้คือ pattern ที่ผมใช้บ่อยที่สุดครับ ส่ง dict เพื่อระบุว่าคอลัมน์ไหนแปลงเป็นอะไร age → int, score → float แต่ name ไม่ระบุก็คงเป็น string เหมือนเดิม ได้ DataFrame กลับมาพร้อมใช้งานเลย ไม่ต้องเขียนแยกสองบรรทัด
คอลัมน์ city มีค่าซ้ำๆ แค่ 3 เมือง แต่ถ้าข้อมูล 1 ล้านแถว เก็บเป็น string ทุกช่องจะเปลืองมากครับ แปลงเป็น category ให้ pandas เก็บแค่ชื่อเมืองครั้งเดียวแล้วใช้ตัวเลข index อ้างอิงแทน ประหยัด memory ได้เยอะมาก เทียบง่ายๆ เหมือน Lookup Table ใน Excel เลยครับ
ค่าเริ่มต้น errors='raise' จะ raise ValueError ทันทีครับ ถ้าอยากข้ามค่าที่แปลงไม่ได้แบบเงียบๆ ให้ใส่ errors='ignore' แต่ผมไม่ค่อยแนะนำ เพราะมันจะคืน Series เดิมโดยไม่แปลงเลย ทำให้งงว่าทำไม dtype ไม่เปลี่ยน ถ้าข้อมูลมีค่าสกปรก ผมชอบใช้ pd.to_numeric(col, errors='coerce') แล้วจัดการ NaN ที่ได้มามากกว่าครับ
ผลเหมือนกันในทางปฏิบัติครับ ทั้งคู่แปลงเป็น string หมด แต่เทคนิคแตกต่างกันนิดนึง — astype(str) ใช้ Python built-in str type ส่วน astype('str') ใช้ pandas string alias ผมส่วนตัวชอบเขียน .astype(str) มากกว่า เพราะอ่านชัดกว่าว่าแปลงเป็น string ครับ
เพราะ pandas เก็บข้อมูลแบบ Lookup Table ครับ แทนที่จะเก็บ string 'Bangkok' ซ้ำ 10,000 ครั้ง มันเก็บแค่ครั้งเดียว แล้วใช้ตัวเลข integer เล็กๆ อ้างอิงแทนในทุกแถว ยิ่งคอลัมน์มีค่าซ้ำเยอะยิ่งประหยัดมาก ผมลองกับข้อมูล 500,000 แถวที่มีหมวดหมู่ 20 ค่า ลด memory ได้ประมาณ 5-8 เท่าเลยครับ
ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas astype จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง
apply ใน pandas ผมใช้สำหรับรันฟังก์ชันกับแต่ละแถวหรือแต่ละคอลัมน์ใน DataFrame หรือรันกับแต่ละค่าใน Series ตอนที่ต้องการ logic ซับซ้อนที่ vectorized operations ทำไม่ได้ครับ
rename ใน pandas ผมใช้สำหรับเปลี่ยนชื่อคอลัมน์หรือ index ใน DataFrame โดยส่ง dict บอกว่า 'ชื่อเดิม' ควรกลายเป็น 'ชื่อใหม่' อะไร เหมือนการ Rename column header ใน Excel แต่ทำแบบโปรแกรมได้ครับ
pandas .str accessor ทำให้ผมใช้ text functions อย่าง upper, replace, contains กับทุกแถวในคอลัมน์พร้อมกันบรรทัดเดียว เหมือนได้ UPPER/SUBSTITUTE/SEARCH ของ Excel แต่ไม่ต้องลากสูตรทีละเซลล์ครับ
pd.to_datetime() ใช้แปลงข้อมูลวันที่ที่อยู่ในรูป string หรือตัวเลขให้กลายเป็น datetime ที่ pandas จัดการได้ครับ พอแปลงแล้วก็เรียงลำดับ คำนวณระยะเวลา และดึงเดือน-ปี-วันออกมาได้ทันที
df.fillna() ใน pandas ผมใช้สำหรับเติมค่า NaN ที่หายไปใน DataFrame ด้วยค่าที่กำหนด เช่น 0, ค่าเฉลี่ย หรือค่าจากแถวก่อนหน้า เป็นขั้นตอนสำคัญในการทำความสะอาดข้อมูลก่อนวิเคราะห์หรือส่งเข้า model ครับ
replace ใน pandas ผมใช้สำหรับแทนที่ค่าหนึ่งด้วยอีกค่าหนึ่งทั้ง DataFrame หรือ Series เหมาะกับงาน cleaning ข้อมูล ใครเคยใช้ Find & Replace (Ctrl+H) ใน Excel มาก่อน บอกเลยว่าตัวนี้คือพี่น้องกันเลยครับ
ยังไม่มีบทความที่เกี่ยวข้องกับฟังก์ชันนี้
Comments
อีเมลของคุณจะไม่ถูกเผยแพร่