บทนำ
Median (ค่ามัธยฐาน) เป็นค่ากึ่งกลางที่แยกข้อมูลครึ่งบนและครึ่งล่าง ทนทานต่อ outliers ดีกว่า mean ใช้ fillna() ร่วมกับ median() เพื่อเติมค่าขาดหาย
ตัวอย่างโค้ด
import pandas as pd
import numpy as np
# สร้าง DataFrame พร้อม NaN
df = pd.DataFrame({
"Car": ['Lexus', 'BMW', 'Audi', 'Bentley', 'Mustang', 'Tesla'],
"Units": [100, 150, np.NaN, 80, np.NaN, np.NaN]
})
print("DataFrame ต้นทาง:")
print(df)
# คำนวณ median ของคอลัมน์ Units (ไม่นับ NaN)
median_val = df['Units'].median()
print(f"\nMedian ของ Units: {median_val}")
# เติม NaN ด้วย median
df['Units'] = df['Units'].fillna(median_val)
print("\nDataFrame หลังเติม NaN ด้วย Median:")
print(df)
ผลลัพธ์
DataFrame ต้นทาง:
Car Units
0 Lexus 100.0
1 BMW 150.0
2 Audi NaN
3 Bentley 80.0
4 Mustang NaN
5 Tesla NaN
Median ของ Units: 100.0
DataFrame หลังเติม NaN ด้วย Median:
Car Units
0 Lexus 100.0
1 BMW 150.0
2 Audi 100.0
3 Bentley 80.0
4 Mustang 100.0
5 Tesla 100.0
วิธีแบบ One-liner (inplace)
df['Units'].fillna(df['Units'].median(), inplace=True)
เติม NaN หลายคอลัมน์พร้อมกัน
# เติมทุกคอลัมน์ตัวเลขด้วย median ของตัวเอง
numeric_cols = df.select_dtypes(include='number').columns
df[numeric_cols] = df[numeric_cols].fillna(df[numeric_cols].median())
# หรือใช้ apply
df = df.apply(lambda col: col.fillna(col.median()) if col.dtype.kind in 'biufc' else col)
เปรียบเทียบ: Mean vs Median vs Mode สำหรับ Imputation
| วิธี | เหมาะสำหรับ | ข้อดี | ข้อเสีย |
|---|---|---|---|
| Mean | Normal distribution | ใช้ข้อมูลทุกค่า | ไวต่อ outliers |
| Median | Skewed distribution, มี outliers | Robust, ไม่ไวต่อ outliers | ไม่ใช้ข้อมูลทุกค่า |
| Mode | Categorical, discrete | ค่าจริงในข้อมูล | อาจหลายค่า (multimodal) |
ข้อควรระวัง
- Median ของคอลัมน์ที่ทั้งหมดเป็น NaN จะได้ NaN → fillna ไม่ทำงาน
- การเติมค่า (imputation) อาจนำ bias เข้ามาได้ ควรพิจารณา domain knowledge
- ใช้
inplace=Trueหรือ assign กลับ:df['col'] = df['col'].fillna(...)
สรุป
ใช้ df['col'].fillna(df['col'].median()) เติม NaN ด้วย median ทนทานต่อ outliers เหมาะกับข้อมูลสถิติที่มีค่าผิดปกติ สำหรับหลายคอลัมน์ ใช้ select_dtypes + fillna + median()