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

การตรวจหาค่าที่หายไป

ใช้ isna(), notna() และ isnull() เพื่อค้นหาตำแหน่ง NaN ใน Series หรือ DataFrame และนับค่าที่หายไปในแต่ละคอลัมน์

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

ค่าที่หายไปใน Pandas คืออะไร

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

Pandas จะปรับ None, float('nan') และ numpy.nan ให้เป็นตัวแทน NaN ภายในแบบเดียวกันสำหรับคอลัมน์ตัวเลข

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'name': ['Alice', None, 'Carol'],
    'age': [25, np.nan, 30],
    'salary': [50000.0, 60000.0, np.nan]
})
print(df)
#     name   age   salary
# 0  Alice  25.0  50000.0
# 1   None   NaN  60000.0
# 2  Carol  30.0      NaN

isna() และ isnull()

isna() และ isnull() เหมือนกันทุกประการ ทั้งสองคืนค่า DataFrame หรือ Series ที่มีรูปร่างเดียวกัน โดยเติม True ในตำแหน่งที่ค่าหายไป และ False ในตำแหน่งอื่น Pandas มีชื่อทั้งสองแบบไว้เพื่อความสะดวกของผู้ใช้เท่านั้น ผลลัพธ์สามารถใช้เป็นมาสก์บูลีนสำหรับกรองหรือคำนวณต่อได้โดยตรง

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': [1, np.nan, 3],
    'B': [np.nan, 2, np.nan]
})

print(df.isna())
#        A      B
# 0  False   True
# 1   True  False
# 2  False   True

# Both are identical
print((df.isna() == df.isnull()).all().all())  # True

ใช้ notna() เพื่อค้นหาค่าที่ไม่หายไป

notna() (มีชื่อพ้องเป็น notnull()) เป็นค่าตรงข้ามของ isna() โดยคืนค่า True เมื่อมีค่าอยู่ และ False เมื่อค่าหายไป วิธีนี้มีประโยชน์เมื่อต้องการกรองให้เหลือเฉพาะแถวที่มีค่าในคอลัมน์สำคัญ เช่น กำหนดให้คีย์หลักหรือตัวแปรเป้าหมายต้องไม่เป็น NaN

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'id': [1, 2, 3],
    'email': ['a@x.com', None, 'c@x.com']
})

# Keep only rows where email is present
with_email = df[df['email'].notna()]
print(with_email)
#    id    email
# 0   1  a@x.com
# 2   3  c@x.com

การนับค่าที่หายไปในแต่ละคอลัมน์

การเรียก .isna().sum() กับ DataFrame จะรวมค่า True (ซึ่งมีค่าเท่ากับ 1) แยกตามคอลัมน์ ทำให้ได้จำนวนค่าที่หายไปในแต่ละคอลัมน์ นี่เป็นขั้นตอนแรกที่มีประโยชน์ที่สุดในการทำความเข้าใจคุณภาพของชุดข้อมูลใหม่ เพราะจะบอกว่าคอลัมน์ใดต้องได้รับการจัดการ

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'name': ['Alice', None, 'Carol', None],
    'age': [25, np.nan, 30, 22],
    'salary': [50000, 60000, np.nan, np.nan]
})

missing_counts = df.isna().sum()
print(missing_counts)
# name      2
# age       1
# salary    2
# dtype: int64

เปอร์เซ็นต์ค่าที่หายไปในแต่ละคอลัมน์

จำนวนค่า NaN แบบสัมบูรณ์มีประโยชน์น้อยกว่าเปอร์เซ็นต์ค่าที่หายไป เพราะจำนวนแบบสัมบูรณ์จะเปลี่ยนแปลงตามขนาดชุดข้อมูล การหาร isna().sum() ด้วยจำนวนแถวทั้งหมด (หรือเรียก isna().mean()) จะให้สัดส่วนค่าที่หายไป ซึ่งคุณสามารถคูณด้วย 100 เพื่อแปลงเป็นเปอร์เซ็นต์ คอลัมน์ที่มีค่าหายไปมากกว่า 30–50% มักต้องตัดสินใจว่าจะเก็บไว้หรือไม่

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': [1, np.nan, 3, np.nan, 5],
    'B': [np.nan, 2, np.nan, 4, 5],
    'C': [1, 2, 3, 4, 5]
})

missing_pct = (df.isna().mean() * 100).round(1)
print(missing_pct)
# A    40.0
# B    40.0
# C     0.0
# dtype: float64

ตารางสรุปค่าที่หายไป

รูปแบบที่ใช้กันทั่วไปใน EDA คือการสร้างตารางสรุปค่าที่หายไป ซึ่งแสดงจำนวน เปอร์เซ็นต์ และชนิดข้อมูลของแต่ละคอลัมน์ไว้ในมุมมองเดียว ทำให้เห็นภาพคุณภาพข้อมูลอย่างครบถ้วนก่อนตัดสินใจทำความสะอาด คุณสามารถเรียงลำดับตารางเพื่อแสดงคอลัมน์ที่มีปัญหามากที่สุดก่อน

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'col_a': [1, np.nan, 3],
    'col_b': [np.nan, np.nan, 3],
    'col_c': [1, 2, 3]
})

summary = pd.DataFrame({
    'missing_count': df.isna().sum(),
    'missing_pct': (df.isna().mean() * 100).round(1),
    'dtype': df.dtypes
}).sort_values('missing_pct', ascending=False)
print(summary)
#         missing_count  missing_pct   dtype
# col_b               2         66.7  float64
# col_a               1         33.3  float64
# col_c               0          0.0  float64

การนับค่าที่หายไปในแต่ละแถว

คุณยังสามารถนับค่าที่หายไปในแต่ละแถวได้ด้วยการเรียก isna().sum(axis=1) วิธีนี้ช่วยระบุระเบียนที่ว่างเกือบทั้งหมด (เช่น คำตอบแบบสำรวจที่กรอกไม่ครบ) ซึ่งคุณอาจต้องการทำเครื่องหมายหรือลบออกทั้งระเบียน แถวที่มีค่าหายไปจำนวนมากแตกต่างจากการมีค่าหายไปกระจัดกระจายในระดับคอลัมน์โดยพื้นฐาน

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'a': [1, np.nan, np.nan],
    'b': [np.nan, 2, np.nan],
    'c': [3, 4, np.nan]
})

# Count NaN per row
df['missing_count'] = df.isna().sum(axis=1)
print(df)
#      a    b    c  missing_count
# 0  1.0  NaN  3.0              1
# 1  NaN  2.0  4.0              1
# 2  NaN  NaN  NaN              3

การกรองแถวที่มีค่าหายไปบางส่วนหรือทั้งหมด

ใช้ df[df.isna().any(axis=1)] เพื่อค้นหาแถวที่มีค่า NaN อย่างน้อยหนึ่งค่า หรือใช้ df[df.isna().all(axis=1)] เพื่อค้นหาแถวที่ทุกค่าเป็น NaN ตัวกรองเหล่านี้ช่วยให้คุณแยกระเบียนที่มีปัญหาออกมาตรวจสอบ ก่อนตัดสินใจว่าจะจัดการกับระเบียนเหล่านั้นอย่างไร

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'x': [1, np.nan, np.nan],
    'y': [2, 3, np.nan],
    'z': [4, 5, np.nan]
})

# Rows with at least one NaN
has_any_nan = df[df.isna().any(axis=1)]
print('Any NaN:\n', has_any_nan)

# Rows where all values are NaN
all_nan = df[df.isna().all(axis=1)]
print('All NaN:\n', all_nan)
#      x    y    z
# 2  NaN  NaN  NaN

การตรวจสอบคอลัมน์เฉพาะว่ามี NaN หรือไม่

หากต้องการตรวจสอบคอลัมน์เดียวอย่างรวดเร็ว ให้เรียก df['col'].isna().sum() หรือใช้ df['col'].isna().any() เพื่อรับค่าบูลีนเพียงค่าเดียว (เป็น True หากมี NaN อย่างน้อยหนึ่งค่า) คำสั่งบรรทัดเดียวเหล่านี้มีประโยชน์ภายในการตรวจสอบความถูกต้องของข้อมูลหรือข้อความบันทึกในกระบวนการทำงาน

import pandas as pd
import numpy as np

df = pd.DataFrame({'price': [10.0, np.nan, 30.0, np.nan, 50.0]})

print('NaN count in price:', df['price'].isna().sum())  # 2
print('Any NaN in price?', df['price'].isna().any())    # True
print('All present?', df['price'].notna().all())         # False

การแสดงค่าที่หายไปด้วยแผนภาพความหนาแน่น

สำหรับชุดข้อมูลที่มีหลายคอลัมน์แผนภาพความหนาแน่นของค่าที่หายไปให้ข้อมูลได้มากกว่าตารางตัวเลข คุณสามารถสร้างได้ง่ายด้วย Seaborn โดยเซลล์ที่มีสีเข้มกว่าจะหมายถึงมีข้อมูลหายไปมากกว่าในการจับคู่คอลัมน์กับแถว ไลบรารีจากภายนอกยอดนิยมชื่อ missingno มีเครื่องมือสำหรับแสดงภาพค่าที่หายไปโดยเฉพาะ

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

np.random.seed(0)
df = pd.DataFrame(
    np.where(np.random.rand(20, 5) > 0.7, np.nan, np.random.randn(20, 5)),
    columns=['A', 'B', 'C', 'D', 'E']
)

# Heatmap of missing values
sns.heatmap(df.isna(), cbar=False, yticklabels=False)
plt.title('Missing Value Pattern')
plt.tight_layout()
plt.savefig('missing_heatmap.png')
print('Saved missing_heatmap.png')

info() เพื่อตรวจสอบค่าที่หายไปอย่างรวดเร็ว

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

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'id': [1, 2, 3, 4, 5],
    'age': [25, np.nan, 30, np.nan, 22],
    'salary': [50000, 60000, np.nan, 70000, 80000]
})

df.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 5 entries, 0 to 4
# Data columns (total 3 columns):
#  #   Column  Non-Null Count  Dtype
# ---  ------  --------------  -----
#  0   id      5 non-null      int64
#  1   age     3 non-null      float64
#  2   salary  4 non-null      float64

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับการตรวจหาค่าที่หายไปใน Pandas

ทบทวนบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า isna() และ isnull() เหมือนกันและคืนค่ามาสก์บูลีนของตำแหน่งที่ค่าหายไป, isna().sum() ใช้นับ NaN ในแต่ละคอลัมน์ และ isna().mean()*100 ใช้คำนวณเปอร์เซ็นต์ค่าที่หายไป ใช้ df.info() เพื่อดูภาพรวมอย่างรวดเร็ว และใช้ isna().any(axis=1) เพื่อค้นหาแถวที่มี NaN อย่างน้อยหนึ่งค่า บทถัดไปเราจะเรียนรู้การลบค่าที่หายไปด้วย dropna()

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

บทเรียน “การตรวจหาค่าที่หายไป” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การตรวจหาค่าที่หายไป”

ใช้ isna(), notna() และ isnull() เพื่อค้นหาตำแหน่ง NaN ใน Series หรือ DataFrame และนับค่าที่หายไปในแต่ละคอลัมน์ คุณปฏิบัติ 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. การลบค่าที่หายไป
  3. การเติมค่าที่หายไป
  4. การประมาณค่าและการแทนค่าขั้นสูง
← กลับไปที่ Pandas & NumPy Academy