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

Python Pandas: เติมค่า NaN ด้วยค่าคงที่ (Constant Value)

บทนำ

ใช้ fillna(value=constant) เติมค่าขาดหาย (NaN) ด้วยค่าคงที่ที่กำหนดเอง เหมาะสำหรับกรณีที่ทราบค่า default หรือ sentinel value

ตัวอย่างโค้ด


import pandas as pd
import numpy as np

df = pd.DataFrame({
    "Car": ['BMW', 'Lexus', 'Lexus', 'Mustang', 'Bentley', 'Mustang'],
    "Units": [100, 150, np.NaN, 80, np.NaN, np.NaN]
})

print("DataFrame ต้นทาง:")
print(df)

const_val = 200

# เติม NaN ในคอลัมน์ Units ด้วย 200
df['Units'].fillna(value=const_val, inplace=True)

print(f"\nDataFrame หลังเติม NaN ด้วย {const_val}:")
print(df)

ผลลัพธ์


DataFrame ต้นทาง:
       Car  Units
0      BMW  100.0
1    Lexus  150.0
2    Lexus    NaN
3  Mustang   80.0
4  Bentley    NaN
5  Mustang    NaN

DataFrame หลังเติม NaN ด้วย 200:
       Car  Units
0      BMW  100.0
1    Lexus  150.0
2    Lexus  200.0
3  Mustang  80.0
4  Bentley  200.0
5  Mustang  200.0

วิธีการเติมค่าคงที่ต่างๆ

1. fillna(value=...) บน Series (คอลัมน์เดียว)


df['Units'].fillna(value=200, inplace=True)
# หรือ
df['Units'] = df['Units'].fillna(200)

2. fillna(value=...) บน DataFrame (หลายคอลัมน์ค่าเดียวกัน)


df.fillna(value=200, inplace=True)  # เติมทุกคอลัมน์

3. fillna(value={col: val, ...}) ค่าแตกต่างต่อคอลัมน์


df.fillna(value={'Units': 200, 'Price': 0, 'Name': 'Unknown'}, inplace=True)

4. ใช้ Dictionary สำหรับคอลัมน์เฉพาะ


fill_values = {
    'Units': 200,
    'Price': 0,
    'Category': 'Unknown'
}
df.fillna(value=fill_values, inplace=True)

กรณีใช้งานจริง

  • Sentinel values: -1, 0, 9999 สำหรับ "ไม่มีข้อมูล"
  • Business default: 0 สำหรับยอดขาย, 'Unknown' สำหรับ category
  • Downstream compatibility: บางระบบไม่รองรับ NaN ต้องแปลงเป็นค่าจริง

ข้อควรระวัง

  • การเติมค่าคงที่อาจนำ bias เข้ามา (เช่น เติม 0 ทำ mean ผิด)
  • คอลัมน์ object/string: ใช้ string constant ('Unknown', 'N/A')
  • คอลัมน์ datetime: ใช้ pd.NaT หรือ Timestamp เฉพาะ
  • Boolean: ใช้ False หรือ True ตาม domain logic

สรุป

ใช้ df['col'].fillna(value=constant, inplace=True) หรือ df.fillna(value={col: val}) สำหรับหลายคอลัมน์ วิธีง่ายและชัดเจน แต่ควรพิจารณา impact ต่อการวิเคราะห์สถิติหลังเติมค่า