การลบค่าที่หายไป
ลบแถวหรือคอลัมน์ที่มี NaN ด้วย dropna() พร้อมกำหนดเกณฑ์และชุดคอลัมน์ที่ต้องการพิจารณา
การลบค่าที่หายไป เป็นบทเรียน 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.0subset= — ตรวจสอบเฉพาะคอลัมน์ที่กำหนด
พารามิเตอร์ 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 NaNthresh= — ข้อกำหนดจำนวนค่าที่ไม่เป็นค่าว่างขั้นต่ำ
พารามิเตอร์ 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, 2dropna() ในกระบวนการทำงาน
เนื่องจาก 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ