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

Python Pandas - เติมค่า NaN ด้วยวิธี Interpolation (ประมาณค่า)

เมธอด interpolate() ใช้เติมค่าที่หายไป (NaN) โดยการ ประมาณค่า (interpolation)** จากค่าที่รู้จักรอบข้าง วิธีเริ่มต้นคือ Linear Interpolation** (เส้นตรง) แต่รองรับวิธีอื่นๆ มากมาย

ขั้นตอนการทำงาน

1. โหลดข้อมูลที่มี NaN

import pandas as pd

dataFrame = pd.read_csv(r"C:\Users\amit_\Desktop\SalesData.csv")
print("DataFrame:\n", dataFrame)

2. ใช้ interpolate() เติมค่า NaN

res = dataFrame.interpolate()
print("\nDataFrame หลัง interpolation:\n", res)

โค้ดตัวอย่างสมบูรณ์

import pandas as pd

dataFrame = pd.read_csv(r"C:\Users\amit_\Desktop\SalesData.csv")
print("DataFrame:\n", dataFrame)

# เติม NaN ด้วย interpolation
res = dataFrame.interpolate()
print("\nDataFrame หลัง interpolation:\n", res)

ผลลัพธ์

DataFrame:
      Car  Reg_Price  Units
0     BMW       2500  100.0
1   Lexus       3500    NaN
2    Audi       2500  120.0
3  Jaguar       2000    NaN
4  Mustang       2500  110.0

DataFrame หลัง interpolation:
      Car  Reg_Price  Units
0     BMW       2500  100.0
1   Lexus       3500  110.0
2    Audi       2500  120.0
3  Jaguar       2000  115.0
4  Mustang       2500  110.0

คำอธิบายผลลัพธ์

  • แถว 1 (Lexus): NaN อยู่ระหว่าง 100 และ 120 → ประมาณเป็น 110 (กลาง)
  • แถว 3 (Jaguar): NaN อยู่ระหว่าง 120 และ 110 → ประมาณเป็น 115 (กลาง)
  • คอลัมน์ Car และ Reg_Price ไม่มี NaN จึงไม่เปลี่ยนแปลง

วิธี Interpolation อื่นๆ (method parameter)

Methodคำอธิบาย
'linear'เส้นตรง (default) เหมาะกับ Time-series ที่มีช่วงเท่ากัน
'time'คำนวณจากเวลา (ต้องมี DatetimeIndex)
'index'ใช้ค่า index เป็นพิกัด
'pad' / 'ffill'Forward fill (ค่าก่อนหน้า)
'bfill'Backward fill (ค่าถัดไป)
'nearest'ใช้ค่าที่ใกล้ที่สุด
'spline', 'polynomial'โค้งเส้น (ต้องระบุ order)

ตัวอย่างใช้ method อื่น

# Forward fill (ค่าก่อนหน้า)
df.fillna(method='ffill')

# Backward fill (ค่าถัดไป)
df.fillna(method='bfill')

# Time-based interpolation (ต้องมี datetime index)
df.set_index('date').interpolate(method='time')

⚠️ ข้อจำกัด

  • ทำงานได้เฉพาะคอลัมน์ตัวเลข (numeric columns)
  • ไม่สามารถประมาณค่า NaN ที่อยู่ขอบ (leading/trailing NaN) ด้วย linear method
  • สำหรับขอบ ใช้ limit_direction='both' หรือ method='pad'/'bfill'