การตรวจสอบชนิดข้อมูลของคอลัมน์
อ่านแอตทริบิวต์ dtypes แยกความแตกต่างระหว่าง int64, float64 และ object และค้นหาคอลัมน์ที่ต้องแปลงชนิด
การตรวจสอบชนิดข้อมูลของคอลัมน์ เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดชนิดข้อมูลของคอลัมน์จึงสำคัญ
ทุกคอลัมน์ใน Pandas DataFrame มีชนิดข้อมูล (ชนิดของข้อมูล) ซึ่งกำหนดวิธีจัดเก็บค่าในหน่วยความจำและการดำเนินการที่ใช้กับค่าเหล่านั้นได้ คอลัมน์จำนวนเต็มที่มีชนิดข้อมูลเป็น object (สตริง) ไม่สามารถนำมาหาผลรวมได้ วันที่ที่จัดเก็บเป็นสตริงจะถูกมองว่าเป็นข้อความ ไม่ใช่อนุกรมเวลา ชนิดข้อมูลที่ไม่ถูกต้องเป็นหนึ่งในสาเหตุที่พบบ่อยที่สุดของข้อผิดพลาดที่ไม่แสดงออกมาอย่างชัดเจนและผลลัพธ์ที่ไม่คาดคิดในกระบวนการวิเคราะห์ข้อมูล
โปรดตรวจสอบชนิดข้อมูลเป็นขั้นตอนแรกทันทีหลังจากโหลดชุดข้อมูลใหม่
import pandas as pd
import numpy as np
df = pd.DataFrame({
'age': ['25', '30', '35'], # looks like int, stored as object
'salary': [50000, 60000, 70000], # int64
'hired': ['2022-01-01', '2023-06-15', '2024-03-10'] # looks like date
})
print(df.dtypes)
# age object
# salary int64
# hired object
# dtype: objectแอตทริบิวต์ dtypes
DataFrame.dtypes ส่งคืน Series ที่มีดัชนีเป็นชื่อคอลัมน์ และมีค่าเป็นชนิดข้อมูล Pandas ของแต่ละคอลัมน์ ชนิดข้อมูลที่พบบ่อย ได้แก่ int64, float64, object (สตริงและข้อมูลหลายชนิดปะปนกัน), bool, datetime64[ns] และ category ชื่อชนิดข้อมูลจะบอกทั้งประเภทของข้อมูลและจำนวนไบต์ที่แต่ละค่าใช้
import pandas as pd
import numpy as np
df = pd.DataFrame({
'int_col': [1, 2, 3],
'float_col': [1.5, 2.5, 3.5],
'str_col': ['a', 'b', 'c'],
'bool_col': [True, False, True]
})
print(df.dtypes)
# int_col int64
# float_col float64
# str_col object
# bool_col bool
# dtype: objectการระบุชนิดข้อมูล object
ชนิดข้อมูล object เป็นชนิดครอบจักรวาลของ Pandas สำหรับคอลัมน์ที่ไม่สามารถจัดเก็บเป็นชนิดตัวเลขหรือบูลีนได้ โดยทั่วไปหมายถึงข้อมูลสตริง แต่ก็อาจหมายถึงคอลัมน์ที่มีข้อมูลหลายชนิดปะปนกัน เช่น จำนวนเต็มปะปนกับสตริง คอลัมน์แบบ object ใช้หน่วยความจำมากกว่าชนิดข้อมูลเฉพาะทาง และดำเนินการได้ช้ากว่า เมื่อพบ object ให้ถามว่า คอลัมน์นี้ควรเป็นสตริง ตัวเลข หมวดหมู่ หรือวันที่
import pandas as pd
df = pd.DataFrame({'mixed': [1, 'two', 3.0, None]})
print(df.dtypes)
# mixed object
# Check actual Python types inside the column
print(df['mixed'].apply(type).value_counts())
# <class 'int'> 1
# <class 'str'> 1
# <class 'float'> 2 (includes NaN which is float)info() สำหรับภาพรวมชนิดข้อมูลทั้งหมด
df.info() พิมพ์ตารางสรุปที่แสดงชื่อคอลัมน์ทุกคอลัมน์ จำนวนค่าที่ไม่ใช่ค่าว่าง และชนิดข้อมูล รวมถึงการใช้หน่วยความจำทั้งหมด คำสั่งเดียวนี้ให้ภาพรวมคุณภาพของชุดข้อมูลอย่างครบถ้วน คุณจะเห็นได้พร้อมกันว่าคอลัมน์ใดมีข้อมูลหายไป และ คอลัมน์ใดมีชนิดข้อมูลไม่ถูกต้อง จึงเป็นคำสั่งมาตรฐานที่ควรใช้เป็นอันดับแรกหลังจากโหลดชุดข้อมูล
import pandas as pd
import numpy as np
df = pd.DataFrame({
'id': [1, 2, 3],
'score': [88.5, 92.0, np.nan],
'grade': ['A', 'A', 'B']
})
df.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 3 entries, 0 to 2
# Data columns (total 3 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 id 3 non-null int64
# 1 score 2 non-null float64
# 2 grade 3 non-null object
# dtypes: float64(1), int64(1), object(1)
# memory usage: 200.0+ bytesปัญหาชนิดข้อมูลที่พบบ่อยหลังใช้ read_csv
เมื่อ Pandas อ่านไฟล์ CSV ระบบจะอนุมานชนิดข้อมูลโดยตรวจดูค่าในคอลัมน์ ปัญหาที่พบบ่อยมีหลายอย่าง ได้แก่ คอลัมน์ตัวเลขถูกอ่านเป็น object หากมีตัวคั่นหลักพันเป็นจุลภาคหรือสัญลักษณ์สกุลเงิน คอลัมน์บูลีนถูกอ่านเป็น object หากจัดเก็บเป็นสตริง 'Yes'/'No' และ คอลัมน์วันที่ถูกอ่านเป็น object เนื่องจาก Pandas จะไม่แยกวิเคราะห์วันที่หากไม่ได้สั่งไว้โดยเฉพาะ การจดจำรูปแบบเหล่านี้ช่วยให้คุณแก้ไขได้อย่างรวดเร็วด้วยการแปลงชนิดข้อมูล
import pandas as pd
import io
csv = '''price,date,is_active
'1,200',2024-01-15,Yes
'800',2024-02-20,No
'''
df = pd.read_csv(io.StringIO(csv))
print(df.dtypes)
# price object <- should be int
# date object <- should be datetime64
# is_active object <- should be boolการใช้หน่วยความจำของชนิดข้อมูลต่าง ๆ
ชนิดข้อมูลต่างกันใช้หน่วยความจำแตกต่างกันมาก คอลัมน์ int64 ใช้ 8 ไบต์ต่อค่า ขณะที่คอลัมน์ object ที่จัดเก็บสตริงสั้น ๆ อาจใช้ 50–200 ไบต์ต่อค่า สำหรับ DataFrames ที่มีหลายล้านแถว การเลือกชนิดข้อมูลที่เหมาะสมอาจลดการใช้หน่วยความจำจากระดับกิกะไบต์เหลือระดับเมกะไบต์ได้ เรียกใช้ df.memory_usage(deep=True) เพื่อดูต้นทุนเป็นไบต์ของแต่ละคอลัมน์
import pandas as pd
import numpy as np
df = pd.DataFrame({
'int64_col': np.arange(1_000_000, dtype='int64'),
'float32_col': np.arange(1_000_000, dtype='float32'),
'obj_col': ['a'] * 1_000_000
})
mem = df.memory_usage(deep=True) / 1024**2 # MB
print(mem.round(2))
# Index 0.00
# int64_col 7.63
# float32_col 3.81
# obj_col 55.26 <- much more for object!การตรวจหาคอลัมน์ตัวเลขที่มีชนิดข้อมูลผิด
ปัญหาที่พบบ่อยคือคอลัมน์ตัวเลขถูกจัดเก็บเป็น object เนื่องจากมีอักขระจัดรูปแบบที่ไม่ควรอยู่ คุณตรวจพบปัญหานี้ได้โดยตรวจสอบว่า pd.to_numeric(df['col'], errors='coerce') ให้ผลลัพธ์แตกต่างจากคอลัมน์เดิมหรือไม่ ค่าที่ไม่สามารถแยกวิเคราะห์ได้จะกลายเป็น NaN ทำให้เห็นได้อย่างชัดเจนว่าแถวใดเป็นสาเหตุให้การอนุมานชนิดข้อมูลล้มเหลว
import pandas as pd
df = pd.DataFrame({'revenue': ['1000', '2000', '$3000', '4,000']})
# Check which values can't be parsed as numbers
parsed = pd.to_numeric(df['revenue'], errors='coerce')
print(parsed)
# 0 1000.0
# 1 2000.0
# 2 NaN <- '$3000' failed
# 3 NaN <- '4,000' failedการตรวจสอบความกำกวมระหว่างจำนวนเต็มกับจำนวนทศนิยม
เมื่อคอลัมน์มีค่า NaN อยู่ Pandas จะจัดเก็บคอลัมน์จำนวนเต็มเป็น float64 เนื่องจากชนิดจำนวนเต็มมาตรฐานของ NumPy ไม่สามารถแทนค่า NaN ได้ จำนวนทศนิยมที่ได้ เช่น 25.0 ดูเหมือนจำนวนเต็ม แต่จัดเก็บเป็นจำนวนทศนิยม Pandas จึงเพิ่มชนิดจำนวนเต็มที่รองรับค่าว่าง (Int64 ที่ใช้ I ตัวพิมพ์ใหญ่) ซึ่งรองรับ NaN และยังคงความหมายแบบจำนวนเต็มไว้ได้
import pandas as pd
import numpy as np
df = pd.DataFrame({'count': [1, 2, np.nan, 4]})
print(df['count'].dtype) # float64 — because NaN is float
# Nullable integer type supports NaN
df['count'] = df['count'].astype('Int64') # capital I!
print(df)
# count
# 0 1
# 1 2
# 2 <NA>
# 3 4
print(df['count'].dtype) # Int64select_dtypes() สำหรับการกรองตามชนิดข้อมูล
df.select_dtypes(include=) ช่วยให้คุณเลือกคอลัมน์ทั้งหมดในกลุ่มชนิดข้อมูลที่กำหนด อาร์กิวเมนต์ที่ใช้บ่อย ได้แก่ 'number' (ข้อมูลตัวเลขทั้งหมด), 'object' (สตริง), 'bool', 'datetime' และ 'category' วิธีนี้มีประโยชน์มากในช่วงเริ่มต้นของกระบวนการทำงาน เพื่อใช้การทำความสะอาดตัวเลขเฉพาะกับคอลัมน์ตัวเลข และการทำความสะอาดสตริงเฉพาะกับคอลัมน์ข้อความ
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'age': [25, 30],
'salary': [50000.0, 70000.0],
'dept': ['Eng', 'HR']
})
numeric = df.select_dtypes(include='number')
print('Numeric columns:', numeric.columns.tolist())
# ['age', 'salary']
text = df.select_dtypes(include='object')
print('Text columns:', text.columns.tolist())
# ['name', 'dept']การสร้างรายงานชนิดข้อมูล
แนวปฏิบัติที่มีประโยชน์ในการทำ EDA คือการสร้างรายงานชนิดข้อมูลที่แสดงชนิดข้อมูลของแต่ละคอลัมน์ จำนวนค่าที่ไม่ซ้ำกัน และค่าตัวอย่าง รายงานนี้ช่วยให้คุณระบุได้อย่างรวดเร็วว่าคอลัมน์ใดต้องแปลงชนิดข้อมูลก่อนเริ่มการวิเคราะห์ คุณสามารถสร้างรายงานลักษณะนี้ได้ด้วย DataFrame แบบง่าย ๆ ที่สร้างจากการรวมข้อมูลแยกตามคอลัมน์
import pandas as pd
import numpy as np
df = pd.DataFrame({
'age': [25, 30, 35],
'salary': [50000, 60000, 70000],
'dept': ['Eng', 'HR', 'Eng'],
'hired': ['2022-01-01', '2023-06-15', '2024-03-10']
})
report = pd.DataFrame({
'dtype': df.dtypes,
'unique_count': df.nunique(),
'sample': df.iloc[0]
})
print(report)ความสอดคล้องของชนิดข้อมูลในกระบวนการทำงานจริง
ในกระบวนการทำงานจริงที่ประมวลผลข้อมูลใหม่ทุกวัน ชนิดข้อมูลอาจเปลี่ยนแปลงไปได้ คอลัมน์ที่เคยเป็น int64 เสมออาจเข้ามาเป็น float64 หากมี NaN เพียงค่าเดียว ให้เพิ่มการตรวจยืนยันชนิดข้อมูลไว้ตอนเริ่มต้นของกระบวนการทำงาน เพื่อดักจับการเปลี่ยนแปลงโครงสร้างข้อมูลตั้งแต่เนิ่น ๆ การทำให้โปรแกรมหยุดทำงานพร้อมแสดงข้อผิดพลาดที่ชัดเจนย่อมดีกว่าการสร้างผลลัพธ์ที่ผิดพลาดในขั้นตอนถัดไปโดยไม่แจ้งเตือน
import pandas as pd
df = pd.DataFrame({'user_id': [1, 2, 3], 'score': [88.0, 92.0, 76.0]})
expected_dtypes = {'user_id': 'int64', 'score': 'float64'}
for col, expected in expected_dtypes.items():
actual = str(df[col].dtype)
assert actual == expected, (
f'Column {col}: expected {expected}, got {actual}'
)
print('All dtypes are correct')ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับการตรวจสอบชนิดข้อมูลของคอลัมน์
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า df.dtypes แสดงชนิดข้อมูลของแต่ละคอลัมน์ ชนิดข้อมูล object เป็นชนิดครอบจักรวาลสำหรับสตริงและข้อมูลหลายชนิดปะปนกัน และ df.info() ให้ภาพรวมที่ครบถ้วนของชนิดข้อมูลและการรองรับค่าว่าง ใช้ select_dtypes() เพื่อกรองคอลัมน์ตามกลุ่มชนิดข้อมูล และเพิ่มการตรวจยืนยันชนิดข้อมูลเพื่อตรวจจับการเปลี่ยนแปลงโครงสร้างในกระบวนการทำงานจริง บทถัดไป เราจะเปลี่ยนคอลัมน์ให้เป็นชนิดข้อมูลที่ถูกต้องโดยใช้ astype()
คำถามที่พบบ่อย
บทเรียน “การตรวจสอบชนิดข้อมูลของคอลัมน์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การตรวจสอบชนิดข้อมูลของคอลัมน์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การตรวจสอบชนิดข้อมูลของคอลัมน์”
อ่านแอตทริบิวต์ dtypes แยกความแตกต่างระหว่าง int64, float64 และ object และค้นหาคอลัมน์ที่ต้องแปลงชนิด คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การตรวจสอบชนิดข้อมูลของคอลัมน์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม
ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตรวจสอบชนิดข้อมูลของคอลัมน์
- การแปลงชนิดด้วย astype()
- ชนิดข้อมูลแบบหมวดหมู่
- การแยกวิเคราะห์วันที่อย่างถูกต้อง