Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python Pandas: เติมค่า NaN ด้วยค่ามัธยฐาน (Median)

บทนำ

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

วิธีเหมาะสำหรับข้อดีข้อเสีย
MeanNormal distributionใช้ข้อมูลทุกค่าไวต่อ outliers
MedianSkewed distribution, มี outliersRobust, ไม่ไวต่อ outliersไม่ใช้ข้อมูลทุกค่า
ModeCategorical, 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()