การแปลงชนิดด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตรวจสอบชนิดข้อมูลของคอลัมน์
- การแปลงชนิดด้วย astype()
- ชนิดข้อมูลแบบหมวดหมู่
- การแยกวิเคราะห์วันที่อย่างถูกต้อง