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

การลบค่าที่หายไป

ลบแถวหรือคอลัมน์ที่มี NaN ด้วย dropna() พร้อมกำหนดเกณฑ์และชุดคอลัมน์ที่ต้องการพิจารณา

บทเรียน 2 จาก 413 ขั้นตอน

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

เมื่อใดจึงควรลบค่าที่หายไป

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

import pandas as pd
import numpy as np

# Example: randomly missing salary data (MCAR-like)
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Carol', 'Dave'],
    'salary': [50000, np.nan, 70000, np.nan]
})
print('Before drop:', df.shape)  # (4, 2)
print(df)

dropna() — การใช้งานพื้นฐาน

DataFrame.dropna() จะลบแถวใดก็ตามที่มีค่า NaN อย่างน้อยหนึ่งค่าโดยค่าเริ่มต้น เมธอดนี้คืนค่า DataFrame ใหม่ โดยต้นฉบับจะไม่เปลี่ยนแปลงเว้นแต่คุณจะส่ง inplace=True สำหรับชุดข้อมูลขนาดเล็กถึงปานกลาง ลักษณะการทำงานเริ่มต้นนี้มักเหมาะสำหรับการทำความสะอาดข้อมูลเบื้องต้นอย่างรวดเร็ว

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'a': [1, np.nan, 3, np.nan],
    'b': [10, 20, np.nan, 40],
    'c': [100, 200, 300, 400]
})

cleaned = df.dropna()
print(cleaned)
#      a     b    c
# 0  1.0  10.0  100

print('Original shape:', df.shape)    # (4, 3)
print('Cleaned shape:', cleaned.shape) # (1, 3)

how='all' — ลบเฉพาะแถวที่เป็น NaN ทั้งหมด

การส่ง how='all' จะสั่งให้ dropna ลบแถวเฉพาะเมื่อทุกค่าในแถวเป็น NaN เท่านั้น วิธีนี้เข้มงวดน้อยกว่าค่าเริ่มต้น how='any' มาก ให้ใช้ how='all' เมื่อชุดข้อมูลมีแถวที่มีข้อมูลกระจัดกระจาย เพราะแถวที่มีข้อมูลอยู่บ้างยังควรเก็บไว้ ขณะที่แถวว่างทั้งหมดเป็นระเบียนที่ไม่มีประโยชน์อย่างชัดเจน

import pandas as pd
import numpy as np

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

# Row 2 has ALL NaN — dropped
# Row 1 has partial NaN — kept with how='all'
cleaned = df.dropna(how='all')
print(cleaned)
#      a    b    c
# 0  1.0  2.0  3.0
# 1  NaN  NaN  4.0

subset= — ตรวจสอบเฉพาะคอลัมน์ที่กำหนด

พารามิเตอร์ subset จะจำกัดคอลัมน์ที่ใช้ตรวจสอบ NaN เมื่อตัดสินใจว่าจะลบแถวหรือไม่ วิธีนี้มีประโยชน์อย่างยิ่งเมื่อมีเพียงบางคอลัมน์ที่สำคัญ เช่น ควรลบแถวหากคอลัมน์ user_id หรือ target ไม่มีค่า แต่ยอมรับ NaN ในคอลัมน์คุณลักษณะที่เป็นตัวเลือกได้

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'user_id': [1, np.nan, 3],
    'score': [88, 95, np.nan],
    'notes': ['ok', 'good', np.nan]
})

# Drop row only if user_id is missing — score and notes NaN are ok
cleaned = df.dropna(subset=['user_id'])
print(cleaned)
#    user_id  score notes
# 0      1.0   88.0    ok
# 2      3.0    NaN   NaN

thresh= — ข้อกำหนดจำนวนค่าที่ไม่เป็นค่าว่างขั้นต่ำ

พารามิเตอร์ thresh จะเก็บแถวไว้ก็ต่อเมื่อแถวนั้นมีค่าที่ไม่ใช่ NaNอย่างน้อย thresh ค่า วิธีนี้ละเอียดกว่า how='any' หรือ how='all' เพราะคุณสามารถระบุได้ว่า “ให้เก็บแถวไว้หากมีข้อมูลอย่างน้อย 3 จาก 5 คอลัมน์” เหมาะสำหรับชุดข้อมูลที่คาดว่าจะมีข้อมูลกระจัดกระจายบ้าง แต่ต้องการลบแถวที่ว่างทั้งหมด

import pandas as pd
import numpy as np

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

# Keep rows with at least 3 non-null values
cleaned = df.dropna(thresh=3)
print(cleaned)
#      a    b    c    d
# 0  1.0  2.0  4.0  5.0
# 1  NaN  3.0  NaN  6.0

การลบคอลัมน์แทนการลบแถว

โดยค่าเริ่มต้น dropna() จะลบแถว (axis=0) ให้ส่ง axis=1 (หรือ axis='columns') เพื่อลบคอลัมน์ที่มี NaN แทน วิธีนี้เหมาะเมื่อคอลัมน์หนึ่งว่างเป็นส่วนใหญ่และให้ข้อมูลที่มีประโยชน์น้อย เพราะการเก็บไว้จะเพิ่มเพียงสัญญาณรบกวนให้กับแบบจำลองหรือตารางสรุป

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['A', 'B', 'C'],
    'temp': [np.nan, np.nan, np.nan],  # completely empty column
    'score': [80, 90, 85]
})

# Drop columns that have any NaN
cleaned = df.dropna(axis=1)
print(cleaned)
#    id name  score
# 0   1    A     80
# 1   2    B     90
# 2   3    C     85

การลบคอลัมน์ตามเกณฑ์ค่าที่หายไป

รูปแบบที่มีประสิทธิภาพคือการลบคอลัมน์ที่มีเปอร์เซ็นต์ค่าที่หายไปเกินเกณฑ์ที่กำหนด คำนวณสัดส่วนค่าที่หายไปในแต่ละคอลัมน์ ระบุคอลัมน์ที่เกินเกณฑ์ (เช่น 50%) แล้วลบด้วย df.drop(columns=cols_to_drop) วิธีนี้เจาะจงกว่าการใช้ dropna(axis=1) ซึ่งจะลบคอลัมน์ที่มี NaN แม้เพียงค่าเดียว

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'a': [1, 2, np.nan, 4, 5],
    'b': [np.nan, np.nan, np.nan, np.nan, 5],  # 80% missing
    'c': [1, np.nan, 3, 4, 5]                   # 20% missing
})

threshold = 0.5
high_missing = df.columns[df.isna().mean() > threshold]
print('Dropping:', high_missing.tolist())  # ['b']

cleaned = df.drop(columns=high_missing)
print(cleaned)

การรักษาดัชนีไว้หลังใช้ dropna()

หลังเรียก dropna() ดัชนีแถวเดิมจะยังคงอยู่ ดังนั้นหากลบแถวที่ 1 และ 3 DataFrame ที่เหลือจะมีดัชนี 0, 2, 4 ซึ่งมักเป็นสิ่งที่ต้องการ เพราะคุณสามารถย้อนตรวจสอบตำแหน่งเดิมได้ แต่บางครั้งคุณอาจต้องการดัชนีเรียงลำดับต่อเนื่องที่เริ่มจาก 0 ให้เรียก .reset_index(drop=True) หลังการลบเพื่อจัดหมายเลขแถวใหม่

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'val': [1, np.nan, 3, np.nan, 5]
})

cleaned = df.dropna()
print('With original index:')
print(cleaned)  # indices 0, 2, 4

cleaned_reset = cleaned.reset_index(drop=True)
print('With reset index:')
print(cleaned_reset)  # indices 0, 1, 2

dropna() ในกระบวนการทำงาน

เนื่องจาก dropna() คืนค่า DataFrame จึงนำไปใช้ในการเรียกเมธอดต่อเนื่องกันได้อย่างเป็นธรรมชาติ การเรียก dropna() ต่อระหว่างขั้นตอนโหลดข้อมูลและวิเคราะห์ เป็นรูปแบบที่สะอาดและช่วยให้กระบวนการทำงานอ่านง่ายโดยไม่ต้องใช้ตัวแปรชั่วคราว นอกจากนี้คุณยังเรียกต่อร่วมกับ query(), assign() และ groupby() ได้ด้วย

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'region': ['East', 'West', None, 'East'],
    'revenue': [100, np.nan, 300, 400]
})

result = (
    df
    .dropna(subset=['region', 'revenue'])
    .groupby('region')['revenue'].sum()
)
print(result)
# region
# East    500.0
# dtype: float64

เมื่อใดที่ไม่ควรลบ: ควรเลือกเติมค่า

การลบแถวทำให้ข้อมูลสูญหาย สำหรับคอลัมน์ที่มีค่าหายไปน้อยกว่า 5–10% โดยทั่วไป การเติมค่า (imputation) มักดีกว่าการลบ นอกจากนี้ หากค่าที่หายไปมีความสัมพันธ์กับตัวแปรเป้าหมาย (Missing Not At Random, MNAR) การลบค่าดังกล่าวจะทำให้เกิดอคติ ตามหลักทั่วไป ควรลบก็ต่อเมื่อค่าที่หายไปเกิดขึ้นแบบสุ่มอย่างแท้จริง ชุดข้อมูลมีขนาดใหญ่พอจนแถวที่หายไปไม่ส่งผลสำคัญ และคอลัมน์หรือแถวนั้นไม่มีสัญญาณที่สามารถกู้คืนได้

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'user': ['Alice', 'Bob', 'Carol', 'Dave'],
    'age': [25, np.nan, 30, np.nan]
})

missing_pct = df['age'].isna().mean()
print(f'Missing age: {missing_pct:.0%}')  # 50%
# 50% missing is high — consider imputing instead of dropping
# df['age'].fillna(df['age'].median(), inplace=True)

ขั้นตอนการทำความสะอาดข้อมูลในทางปฏิบัติ

ขั้นตอนการจัดการค่าที่หายไปในทางปฏิบัติจะผสานกลยุทธ์ของ dropna หลายรูปแบบเข้าด้วยกัน โดยเริ่มจากลบแถวที่ว่างทั้งหมด จากนั้นลบคอลัมน์ที่ว่างมากกว่า 60% แล้วลบแถวที่ไม่มีค่าในคอลัมน์ ID หรือคอลัมน์เป้าหมายที่สำคัญ สุดท้ายจึงเติมค่า NaN ที่เหลือซึ่งกระจัดกระจายอยู่ วิธีการแบบเป็นชั้นนี้ช่วยรักษาข้อมูลไว้ให้ได้มากที่สุด

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'id': [1, 2, 3, np.nan],
    'feature': [1.0, np.nan, 3.0, 4.0],
    'useless': [np.nan, np.nan, np.nan, np.nan]
})

clean = (
    df
    .dropna(how='all')              # remove all-NaN rows
    .drop(columns=df.columns[df.isna().mean() > 0.9])  # remove >90% empty cols
    .dropna(subset=['id'])           # must have an ID
)
print(clean)
#      id  feature
# 0   1.0      1.0
# 1   2.0      NaN
# 2   3.0      3.0

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

ทดสอบความเข้าใจของคุณเกี่ยวกับการลบค่าที่หายไปด้วย dropna()

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า dropna() จะลบแถวที่มี NaN เป็นค่าเริ่มต้น, how='all' จะลบเฉพาะแถวที่ว่างทั้งหมด, subset= ใช้จำกัดการตรวจสอบไว้ที่คอลัมน์ที่ระบุ และ thresh= ใช้เก็บแถวที่มีค่าที่ไม่ใช่ค่าว่างอย่างน้อยตามจำนวนที่กำหนด ใช้ axis=1 เพื่อลบคอลัมน์แทนแถว บทถัดไป เราจะเติมค่าที่หายไปแทนการลบด้วย fillna()

เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

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

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

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

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

ลบแถวหรือคอลัมน์ที่มี NaN ด้วย dropna() พร้อมกำหนดเกณฑ์และชุดคอลัมน์ที่ต้องการพิจารณา คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การลบค่าที่หายไป” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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