---
title: pandas astype — แปลง dtype ของคอลัมน์ให้ถูกต้อง
url: https://www.thepexcel.com/functions/python/transform/pandas-astype/
type: function-explainer
program: Python
syntax: "df.astype(dtype, errors)"
date: 2026-05-31
scores:
  popularity: 5
  difficulty: 3
  usefulness: 5
---

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

> astype ใน pandas ผมใช้สำหรับแปลงประเภทข้อมูล (dtype) ของคอลัมน์หรือ DataFrame เช่น จาก object เป็น i

## คำอธิบาย

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

## Syntax

```excel
df.astype(dtype, errors)
```

## Arguments

| Name | Required | Type | Default | Description |
| --- | --- | --- | --- | --- |
| dtype | Yes | str \| type \| dict |  | dtype ที่อยากแปลงไป เช่น 'int64', float, str, 'category' หรือ dict {'col1': int, 'col2': float} สำหรับแปลงหลายคอลัมน์พร้อมกัน |
| errors | No | str | 'raise' | 'raise' (default) จะ raise exception ถ้าแปลงไม่ได้ / 'ignore' จะคืนค่าเดิมถ้าแปลงไม่ได้โดยไม่ error |

## ตัวอย่าง

### 1. ตัวอย่างที่ 1: แปลงคอลัมน์ตัวเลขจาก object เป็น int

```excel
df['age'].astype(int)
```

**ผลลัพธ์:** `0    25
1    30
2    28
Name: age, dtype: int64`

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

### 2. ตัวอย่างที่ 2: แปลงคอลัมน์ตัวเลขเป็น float

```excel
df['price'].astype(float)
```

**ผลลัพธ์:** `0    100.0
1    250.0
2    399.0
Name: price, dtype: float64`

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

### 3. ตัวอย่างที่ 3: แปลงหลายคอลัมน์พร้อมกันด้วย dict

```excel
df.astype({'age': int, 'score': float})
```

**ผลลัพธ์:** `   age  score   name
0   25   88.5  Alice
1   30   92.0    Bob
2   28   76.3  Carol`

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

### 4. ตัวอย่างที่ 4: แปลงคอลัมน์ที่มีค่าซ้ำๆ เป็น category เพื่อประหยัด memory

```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']`

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

## หมายเหตุเพิ่มเติม

- 💡 รัน df.dtypes หรือ df.info() ก่อนเสมอครับ จะเห็นภาพรวมว่าคอลัมน์ไหนยัง object อยู่ทั้งที่ควรเป็นตัวเลข แล้วค่อยใช้ astype แก้ให้ถูกก่อนวิเคราะห์จริง ผมทำเป็น step แรกหลังโหลดข้อมูลทุกครั้งเลย

- ถ้าคอลัมน์มีค่าซ้ำกันไม่เกิน 10-20% ของ unique values เช่น จังหวัด แผนก เกรด ลอง .astype('category') ดูครับ ประหยัด memory ได้เยอะ และ pandas ยังใช้ category ในการ sort ตามลำดับที่กำหนดเองได้ด้วย เหมาะมากสำหรับข้อมูล ordinal เช่น เกรด A-F

## คำถามที่พบบ่อย

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

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

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

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

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

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

## แหล่งข้อมูลเพิ่มเติม

- [pandas DataFrame.astype (official docs)](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.astype.html) _(article)_

---

_Source: [https://www.thepexcel.com/functions/python/transform/pandas-astype/](https://www.thepexcel.com/functions/python/transform/pandas-astype/)_
