Thep Excel

pandas astypeแปลง dtype ของคอลัมน์ให้ถูกต้อง

astype ใน pandas ผมใช้สำหรับแปลงประเภทข้อมูล (dtype) ของคอลัมน์หรือ DataFrame เช่น จาก object เป็น int หรือ float เป็น str ทำให้คำนวณได้ถูกต้องและประหยัด memory มากขึ้นครับ

>_
df.astype(dtype, errors)

ความนิยม5/10
ความยาก3/10
ประโยชน์5/10

อัปเดต 31 May 2026

Syntax & Arguments

คืนค่า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

[ ] = อาร์กิวเมนต์ที่ไม่บังคับ

Additional Notes

ปัญหาที่ผมเจอบ่อยมากตอนโหลดข้อมูลจาก CSV หรือ Excel คือคอลัมน์ตัวเลขดันเป็น object หรือ string ทำให้บวกลบไม่ได้ กราฟออกมาแปลกๆ หรือ groupby ให้ผลผิดพลาดครับ astype คือเครื่องมือที่แก้ปัญหานี้ได้ตรงๆ เลย — สั่งแปลง dtype ได้ทั้งทั้งคอลัมน์เดียว หลายคอลัมน์พร้อมกัน หรือทั้ง DataFrame

ที่เจ๋งคือ astype รับ dict เพื่อแปลงหลายคอลัมน์พร้อมกัน เช่น df.astype({‘age’: int, ‘score’: float}) ในบรรทัดเดียว ไม่ต้องวนเขียนทีละคอลัมน์ นอกจากนี้ยังแปลงเป็น ‘category’ ได้ ซึ่งช่วยประหยัด memory ได้มากในคอลัมน์ที่มีค่าซ้ำๆ เช่น จังหวัด แผนก หมวดหมู่สินค้า

ส่วนตัวผมแนะนำให้รัน df.dtypes ดูก่อนเสมอเลยครับ จะได้รู้ว่าคอลัมน์ไหนยังมี dtype ผิดอยู่ แล้วค่อยใช้ astype แก้ให้ถูกก่อนเริ่มวิเคราะห์จริงๆ 😎

Examples

ตัวอย่างที่ 1: แปลงคอลัมน์ตัวเลขจาก object เป็น intdf['age'].astype(int)

ผมโหลดข้อมูลมาแล้วคอลัมน์ age เป็น string ('25', '30') ไม่ใช่ตัวเลขจริงๆ พอใช้ astype(int) มันจะแปลงทุกค่าให้กลายเป็น integer ใช้คำนวณได้เลยครับ เทียบกับ Excel เหมือนตอนที่ตัวเลขอยู่ในเซลล์ text แล้วเราต้องแปลงกลับเป็นตัวเลขนั่นแหละ

>_
df['age'].astype(int)

ผลลัพธ์0 25
1 30
2 28
Name: age, dtype: int64
ตัวอย่างที่ 2: แปลงคอลัมน์ตัวเลขเป็น floatdf['price'].astype(float)

คอลัมน์ price เริ่มต้นเป็น int แต่ผมอยากเป็น float เพื่อรองรับทศนิยมเวลาคำนวณส่วนลดหรือภาษีครับ astype(float) แปลงได้ทันที ค่า 100 กลายเป็น 100.0

>_
df['price'].astype(float)

ผลลัพธ์0 100.0
1 250.0
2 399.0
Name: price, dtype: float64
ตัวอย่างที่ 3: แปลงหลายคอลัมน์พร้อมกันด้วย dictdf.astype({'age': int, 'score': float})

อันนี้คือ pattern ที่ผมใช้บ่อยที่สุดครับ ส่ง dict เพื่อระบุว่าคอลัมน์ไหนแปลงเป็นอะไร age → int, score → float แต่ name ไม่ระบุก็คงเป็น string เหมือนเดิม ได้ DataFrame กลับมาพร้อมใช้งานเลย ไม่ต้องเขียนแยกสองบรรทัด

>_
df.astype({'age': int, 'score': float})

ผลลัพธ์ age score name
0 25 88.5 Alice
1 30 92.0 Bob
2 28 76.3 Carol
ตัวอย่างที่ 4: แปลงคอลัมน์ที่มีค่าซ้ำๆ เป็น category เพื่อประหยัด memorydf['city'].astype('category')

คอลัมน์ city มีค่าซ้ำๆ แค่ 3 เมือง แต่ถ้าข้อมูล 1 ล้านแถว เก็บเป็น string ทุกช่องจะเปลืองมากครับ แปลงเป็น category ให้ pandas เก็บแค่ชื่อเมืองครั้งเดียวแล้วใช้ตัวเลข index อ้างอิงแทน ประหยัด memory ได้เยอะมาก เทียบง่ายๆ เหมือน Lookup Table ใน Excel เลยครับ

>_
df['city'].astype('category')

ผลลัพธ์0 Bangkok
1 Chiang Mai
2 Bangkok
3 Phuket
4 Bangkok
5 Chiang Mai
Name: city, dtype: category
Categories (3, str): ['Bangkok', 'Chiang Mai', 'Phuket']

FAQs

ถ้ามีค่าที่แปลงไม่ได้ เช่น string 'abc' ปนอยู่ในคอลัมน์ตัวเลข จะเกิดอะไรขึ้น?+

ค่าเริ่มต้น errors='raise' จะ raise ValueError ทันทีครับ ถ้าอยากข้ามค่าที่แปลงไม่ได้แบบเงียบๆ ให้ใส่ errors='ignore' แต่ผมไม่ค่อยแนะนำ เพราะมันจะคืน Series เดิมโดยไม่แปลงเลย ทำให้งงว่าทำไม dtype ไม่เปลี่ยน ถ้าข้อมูลมีค่าสกปรก ผมชอบใช้ pd.to_numeric(col, errors='coerce') แล้วจัดการ NaN ที่ได้มามากกว่าครับ

astype('str') กับ astype(str) ต่างกันไหม?+

ผลเหมือนกันในทางปฏิบัติครับ ทั้งคู่แปลงเป็น string หมด แต่เทคนิคแตกต่างกันนิดนึง — astype(str) ใช้ Python built-in str type ส่วน astype('str') ใช้ pandas string alias ผมส่วนตัวชอบเขียน .astype(str) มากกว่า เพราะอ่านชัดกว่าว่าแปลงเป็น string ครับ

ทำไม dtype 'category' ถึงประหยัด memory กว่า?+

เพราะ pandas เก็บข้อมูลแบบ Lookup Table ครับ แทนที่จะเก็บ string 'Bangkok' ซ้ำ 10,000 ครั้ง มันเก็บแค่ครั้งเดียว แล้วใช้ตัวเลข integer เล็กๆ อ้างอิงแทนในทุกแถว ยิ่งคอลัมน์มีค่าซ้ำเยอะยิ่งประหยัดมาก ผมลองกับข้อมูล 500,000 แถวที่มีหมวดหมู่ 20 ค่า ลด memory ได้ประมาณ 5-8 เท่าเลยครับ

Resources & Related

ฟังก์ชันที่ผู้เขียนโยงไว้กับ pandas astype จัดกลุ่มตามหมวด · ชี้ที่ชื่อใดชื่อหนึ่ง แล้วฟังก์ชันที่ใช้คู่กันจะมีจุดทอง

ฟังก์ชันนี้pandas astypeTransform
Transform (4)
pandas apply

apply ใน pandas ผมใช้สำหรับรันฟังก์ชันกับแต่ละแถวหรือแต่ละคอลัมน์ใน DataFrame หรือรันกับแต่ละค่าใน Series ตอนที่ต้องการ logic ซับซ้อนที่ vectorized operations ทำไม่ได้ครับ

pandas rename

rename ใน pandas ผมใช้สำหรับเปลี่ยนชื่อคอลัมน์หรือ index ใน DataFrame โดยส่ง dict บอกว่า 'ชื่อเดิม' ควรกลายเป็น 'ชื่อใหม่' อะไร เหมือนการ Rename column header ใน Excel แต่ทำแบบโปรแกรมได้ครับ

pandas .str

pandas .str accessor ทำให้ผมใช้ text functions อย่าง upper, replace, contains กับทุกแถวในคอลัมน์พร้อมกันบรรทัดเดียว เหมือนได้ UPPER/SUBSTITUTE/SEARCH ของ Excel แต่ไม่ต้องลากสูตรทีละเซลล์ครับ

pandas to_datetime

pd.to_datetime() ใช้แปลงข้อมูลวันที่ที่อยู่ในรูป string หรือตัวเลขให้กลายเป็น datetime ที่ pandas จัดการได้ครับ พอแปลงแล้วก็เรียงลำดับ คำนวณระยะเวลา และดึงเดือน-ปี-วันออกมาได้ทันที

Cleaning (2)
pandas fillna

df.fillna() ใน pandas ผมใช้สำหรับเติมค่า NaN ที่หายไปใน DataFrame ด้วยค่าที่กำหนด เช่น 0, ค่าเฉลี่ย หรือค่าจากแถวก่อนหน้า เป็นขั้นตอนสำคัญในการทำความสะอาดข้อมูลก่อนวิเคราะห์หรือส่งเข้า model ครับ

pandas replace

replace ใน pandas ผมใช้สำหรับแทนที่ค่าหนึ่งด้วยอีกค่าหนึ่งทั้ง DataFrame หรือ Series เหมาะกับงาน cleaning ข้อมูล ใครเคยใช้ Find & Replace (Ctrl+H) ใน Excel มาก่อน บอกเลยว่าตัวนี้คือพี่น้องกันเลยครับ

Comments

อีเมลของคุณจะไม่ถูกเผยแพร่