0Pricing
Pandas & NumPy Academy · บทเรียน

การแปลงชนิดด้วย astype()

แปลงคอลัมน์เป็น int, float, string, boolean และ datetime ด้วย astype() พร้อมจัดการข้อผิดพลาดที่พบบ่อยในการแปลงชนิด

การแปลงชนิดด้วย astype() เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

บทนำสู่ astype()

Series.astype(dtype) แปลงคอลัมน์จากชนิดปัจจุบันเป็นชนิดที่คุณระบุ ฟังก์ชันนี้ส่งคืน Series ใหม่ (หรือ DataFrame เมื่อเรียกใช้กับ DataFrame ทั้งชุด) โดยไม่แก้ไขข้อมูลต้นฉบับ นี่เป็นเครื่องมือหลักของ Pandas สำหรับแก้ปัญหาชนิดข้อมูลหลังโหลดข้อมูล และสามารถแปลงระหว่างชนิดตัวเลข แปลงเป็นสตริง แปลงเป็นบูลีน และแปลงเป็นชนิด Categorical ได้

import pandas as pd

df = pd.DataFrame({'age': ['25', '30', '35']})
print('Before:', df['age'].dtype)  # object

df['age'] = df['age'].astype(int)
print('After:', df['age'].dtype)   # int64
print(df['age'] + 1)               # [26, 31, 36] — arithmetic now works

การแปลงเป็นชนิดตัวเลข

การแปลงที่พบบ่อยที่สุดคือการแปลงจาก object เป็นชนิดตัวเลข คุณสามารถแปลงเป็น 'int64', 'int32', 'float64', 'float32' และชนิดอื่น ๆ ได้ หากมีค่าใดในคอลัมน์ที่แปลงไม่ได้ astype() จะส่งข้อผิดพลาด ValueError ให้ใช้ pd.to_numeric(series, errors='coerce') แทนเมื่อคอลัมน์อาจมีสตริงที่ไม่ใช่ตัวเลข เพราะฟังก์ชันนี้จะแปลงค่าที่ไม่ถูกต้องเป็น NaN แทนการทำงานล้มเหลว

import pandas as pd

df = pd.DataFrame({'price': ['10.5', '20.0', 'N/A', '30.5']})

# astype would crash on 'N/A'
# price_float = df['price'].astype(float)  # ValueError!

# pd.to_numeric with errors='coerce' is safer
df['price_float'] = pd.to_numeric(df['price'], errors='coerce')
print(df)
#   price  price_float
# 0  10.5         10.5
# 1  20.0         20.0
# 2   N/A          NaN
# 3  30.5         30.5

การแปลงเป็นสตริง (object)

การแปลงคอลัมน์เป็น str (หรือ 'object') จะเปลี่ยนค่าทุกค่าให้เป็นรูปแบบสตริงของค่านั้น วิธีนี้มีประโยชน์เมื่อต้องต่อคอลัมน์ตัวเลขเข้ากับคอลัมน์ข้อความ หรือต้องการใช้เมธอดสตริงกับข้อมูลตัวเลข เช่น การเติมศูนย์หน้าเลขรหัส นอกจากนี้ Pandas ยังมีชนิดข้อมูล 'string' รุ่นใหม่ที่จัดการ NA สำหรับคอลัมน์ข้อความได้ดีกว่า

import pandas as pd

df = pd.DataFrame({'id': [1, 2, 3], 'region': ['E', 'W', 'N']})

# Concatenate id and region into a composite key
df['key'] = df['id'].astype(str) + '_' + df['region']
print(df)
#    id region  key
# 0   1      E  1_E
# 1   2      W  2_W
# 2   3      N  3_N

การแปลงเป็นบูลีน

การแปลงเป็นบูลีนมีประโยชน์เมื่อคอลัมน์จัดเก็บค่า True/False เป็นจำนวนเต็ม (0/1) หรือเป็นสตริง ('Yes'/'No') การแปลงจำนวนเต็ม 0/1 ด้วย astype(bool) ทำได้โดยตรง: 0 จะกลายเป็น False และค่าที่ไม่ใช่ศูนย์จะกลายเป็น True สำหรับคอลัมน์สตริง 'Yes'/'No' ให้ใช้ map ด้วยพจนานุกรมก่อน แล้วจึงแปลงชนิด

import pandas as pd

df = pd.DataFrame({
    'active_int': [1, 0, 1, 0],
    'active_str': ['Yes', 'No', 'Yes', 'No']
})

# Integer to bool
df['active_bool'] = df['active_int'].astype(bool)

# String to bool via mapping
df['active_bool2'] = df['active_str'].map({'Yes': True, 'No': False})

print(df[['active_bool', 'active_bool2']])
#    active_bool  active_bool2
# 0         True          True
# 1        False         False

การลดขนาดชนิดข้อมูลตัวเลข

โดยค่าเริ่มต้น Pandas ใช้ชนิดข้อมูลแบบ 64 บิต หากค่าจำนวนเต็มของคุณอยู่ในช่วงที่ใช้ 32 หรือแม้แต่ 8 บิตได้ คุณสามารถลดขนาดชนิดข้อมูลให้เล็กลงเพื่อลดการใช้หน่วยความจำลงครึ่งหนึ่ง (หรือหนึ่งในสี่) ใช้ pd.to_numeric(series, downcast='integer') หรือตั้งชนิดโดยตรงด้วย astype('int32') นี่เป็นการเพิ่มประสิทธิภาพที่สำคัญสำหรับชุดข้อมูลขนาดใหญ่

import pandas as pd
import numpy as np

df = pd.DataFrame({'count': np.random.randint(0, 200, 1_000_000)})

print('int64 bytes:', df['count'].nbytes)   # 8,000,000

df['count_int16'] = df['count'].astype('int16')  # max 32767, fits 0-200
print('int16 bytes:', df['count_int16'].nbytes)  # 2,000,000

# Or let Pandas choose the smallest type automatically
df['count_auto'] = pd.to_numeric(df['count'], downcast='integer')
print('auto dtype:', df['count_auto'].dtype)

การแปลง DataFrame ทั้งหมดด้วย astype(dict)

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

import pandas as pd

df = pd.DataFrame({
    'age': ['25', '30'],
    'salary': ['50000', '70000'],
    'is_manager': ['1', '0']
})

df = df.astype({
    'age': 'int32',
    'salary': 'float64',
    'is_manager': 'bool'
})
print(df.dtypes)
# age           int32
# salary      float64
# is_manager     bool

การจัดการข้อผิดพลาดใน astype()

astype() ไม่มีโหมดในตัวสำหรับยอมรับข้อผิดพลาด (ต่างจาก pd.to_numeric) หากการแปลงล้มเหลว ฟังก์ชันจะส่งข้อผิดพลาด ValueError หรือ OverflowError กระบวนการที่ปลอดภัยคือ (1) ทำความสะอาดคอลัมน์ก่อน (ลบสัญลักษณ์และเติมค่า NaN) (2) จากนั้นจึงแปลงชนิด อีกทางเลือกหนึ่งคือใช้ pd.to_numeric(errors='coerce') สำหรับข้อมูลตัวเลข หรือเขียนฟังก์ชันช่วยขนาดเล็กที่ดักจับข้อผิดพลาดจากการแปลงชนิด

import pandas as pd

# Clean then cast pattern
df = pd.DataFrame({'price': ['$1,200', '$800', '$450']})

# Step 1: remove non-numeric characters
df['price_clean'] = (
    df['price']
    .str.replace('$', '', regex=False)
    .str.replace(',', '', regex=False)
)
# Step 2: safe cast
df['price_num'] = df['price_clean'].astype(float)
print(df)
#      price price_clean  price_num
# 0  $1,200        1200     1200.0
# 1    $800         800      800.0
# 2    $450         450      450.0

การแปลงเป็น Pandas StringDtype

ชนิดข้อมูล 'string' รุ่นใหม่ (รูปแบบที่ใช้ S ตัวพิมพ์ใหญ่ หรือ pd.StringDtype()) ถูกเพิ่มเข้ามาเพื่อรองรับสตริงโดยเฉพาะ พร้อมการจัดการ NA อย่างถูกต้อง โดยจัดเก็บสตริงที่หายไปเป็น pd.NA แทนที่จะเป็น None หรือ np.nan ชนิดนี้เปิดให้ใช้ตัวเข้าถึง .str และรักษาความหมายของ NA ได้ดีกว่าชนิดข้อมูล object จึงแนะนำสำหรับโค้ดใหม่ที่มุ่งใช้กับ Pandas 2 ขึ้นไป

import pandas as pd

df = pd.DataFrame({'name': ['Alice', None, 'Carol']})

# Convert to the modern string dtype
df['name'] = df['name'].astype('string')
print(df['name'].dtype)   # string
print(df['name'].isna())  # proper NA detection
# 0    False
# 1     True
# 2    False

ความเสี่ยงจากค่าล้นเมื่อ ลดขนาดชนิดข้อมูล

เมื่อคุณลดขนาดชนิดข้อมูลเป็นชนิดจำนวนเต็มที่เล็กลง ค่าที่เกินช่วงของชนิดนั้นจะเกิดค่าล้นอย่างเงียบ ๆ และวนกลับไปเป็นค่าอื่น ตัวอย่างเช่น การแปลง 300 เป็น int8 (ช่วง -128 ถึง 127) จะได้ 44 โดยไม่ส่งข้อผิดพลาด โปรดตรวจสอบเสมอว่าช่วงค่าจริงของข้อมูลอยู่ภายในช่วงของชนิดเป้าหมายก่อนลดขนาด เพื่อหลีกเลี่ยงความเสียหายของข้อมูลที่ตรวจพบได้ยาก

import pandas as pd
import numpy as np

df = pd.DataFrame({'value': [100, 200, 300, 127, 128]})

# int8 range: -128 to 127
df['value_i8'] = df['value'].astype('int8')
print(df)
#    value  value_i8
# 0    100       100
# 1    200       -56   <- overflow! 200-256 = -56
# 2    300        44   <- overflow! 300-256 = 44
# 3    127       127
# 4    128      -128   <- overflow!

# Always check range first
print(df['value'].max())  # 300 > 127 — int8 is UNSAFE here

การตรวจสอบการแปลงด้วยแผนผังชนิดข้อมูล

หลังจากแปลงชนิดข้อมูลหลายรายการแล้ว ให้ตรวจสอบโครงสร้างข้อมูลสุดท้ายโดยเปรียบเทียบชนิดข้อมูลจริงกับแผนผังที่คาดไว้ รูปแบบการตรวจยืนยันนี้ช่วยตรวจจับข้อผิดพลาด เช่น คอลัมน์ที่แปลงไม่สำเร็จ (เพราะ NaN ทำให้แปลงเป็นจำนวนเต็มไม่ได้) ให้เรียกใช้การตรวจสอบเหล่านี้ตอนท้ายของฟังก์ชันโหลดข้อมูลในฐานะการทดสอบโครงสร้างข้อมูลแบบเบา ๆ

import pandas as pd

df = pd.DataFrame({
    'user_id': [1, 2, 3],
    'amount': [10.5, 20.0, 30.5],
    'active': [True, False, True]
})

expected = {'user_id': 'int64', 'amount': 'float64', 'active': 'bool'}

for col, dtype in expected.items():
    assert str(df[col].dtype) == dtype, (
        f'{col}: expected {dtype}, got {df[col].dtype}'
    )
print('Schema validation passed')

ตัวอย่างกระบวนการแปลงข้อมูลทั้งหมด

มาดูภาพรวมทั้งหมดกัน นี่คือตัวอย่างกระบวนการแปลงข้อมูลหลัง read_csv ที่ใช้งานได้จริง ซึ่งทำความสะอาดรูปแบบ จัดการ NaN อย่างปลอดภัย แปลงเป็นชนิดข้อมูลที่เหมาะสมที่สุด และตรวจสอบผลลัพธ์ รูปแบบนี้ — ทำความสะอาด แปลงชนิด ตรวจสอบ — ควรเป็นส่วนมาตรฐานของฟังก์ชันนำเข้าข้อมูลทุกฟังก์ชัน

import pandas as pd

raw = pd.DataFrame({
    'user_id': ['101', '102', '103'],
    'revenue': ['$1,200', '$800', '$2,500'],
    'active': ['Yes', 'No', 'Yes']
})

df = (
    raw
    .assign(
        user_id=raw['user_id'].astype('int32'),
        revenue=pd.to_numeric(
            raw['revenue'].str.replace('[$,]', '', regex=True)
        ),
        active=raw['active'].map({'Yes': True, 'No': False})
    )
)
print(df.dtypes)
# user_id      int32
# revenue    float64
# active        bool

ตรวจสอบความเข้าใจ

ทดสอบความเข้าใจเกี่ยวกับการแปลงชนิดด้วย astype()

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า astype(dtype) แปลงคอลัมน์หรือ DataFrame ทั้งหมดเป็นชนิดใหม่ pd.to_numeric(errors='coerce') ปลอดภัยกว่าสำหรับคอลัมน์ที่มีสตริงที่ไม่ใช่ตัวเลข และการส่งพจนานุกรมให้ astype() ช่วยแปลงหลายคอลัมน์พร้อมกันได้ ลดขนาดชนิดข้อมูลอย่างระมัดระวังเพื่อหลีกเลี่ยงค่าล้น และตรวจสอบโครงสร้างข้อมูลสุดท้ายด้วยการตรวจยืนยันเสมอ บทถัดไป เราจะสำรวจชนิดข้อมูล Categorical ที่ประหยัดหน่วยความจำ

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

บทเรียน “การแปลงชนิดด้วย astype()” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแปลงชนิดด้วย astype()” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแปลงชนิดด้วย astype()”

แปลงคอลัมน์เป็น int, float, string, boolean และ datetime ด้วย astype() พร้อมจัดการข้อผิดพลาดที่พบบ่อยในการแปลงชนิด คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การแปลงชนิดด้วย astype()” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตรวจสอบชนิดข้อมูลของคอลัมน์
  2. การแปลงชนิดด้วย astype()
  3. ชนิดข้อมูลแบบหมวดหมู่
  4. การแยกวิเคราะห์วันที่อย่างถูกต้อง
← กลับไปที่ Pandas & NumPy Academy