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

การตรวจสอบชนิดข้อมูลของคอลัมน์

อ่านแอตทริบิวต์ 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)  # Int64

select_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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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