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