บทความนี้สาธิตวิธีแทนที่ค่าลบใน DataFrame ด้วยค่าบวกที่อยู่ก่อนหน้าล่าสุด (Forward Fill) และกรณีที่ไม่มีค่าบวกก่อนหน้า ให้ใช้ 0 แทน
โค้ดตัวอย่าง
import pandas as pd
# สร้าง DataFrame ที่มีค่าลบ
df = pd.DataFrame({
'One': [-3, 7, 4, 0],
'two': [-6, -1, 2, -8]
})
print("DataFrame ต้นฉบับ:")
print(df)
# ขั้นตอนการประมวลผล:
# 1. mask(df.lt(0)) : แมสก์ค่าที่น้อยกว่า 0 (ค่าลบ) → กลายเป็น NaN
# 2. ffill() : Forward Fill - เติม NaN ด้วยค่าก่อนหน้าที่ไม่ใช่ NaN
# 3. fillna(0) : เติม NaN ที่เหลือ (ไม่มีค่าก่อนหน้า) ด้วย 0
# 4. astype('int32') : แปลงกลับเป็น Integer
df = df.mask(df.lt(0)).ffill().fillna(0).astype('int32')
print("\nDataFrame หลังประมวลผล:")
print(df)
ผลลัพธ์
DataFrame ต้นฉบับ:
One two
0 -3 -6
1 7 -1
2 4 2
3 0 -8
DataFrame หลังประมวลผล:
One two
0 0 0
1 7 0
2 4 2
3 0 2
อธิบายขั้นตอนทีละขั้น (Column 'two')
| ขั้นตอน | ค่า | คำอธิบาย |
|---|---|---|
| ต้นฉบับ | -6 | ค่าลบ |
| mask(lt(0)) | NaN | ค่าลบ → NaN |
| ffill() | NaN | ไม่มีค่าก่อนหน้า → ยังคง NaN |
| fillna(0) | 0 | เติม 0 |
| แถว 1 | -1 → NaN → 7 → 7 | ค่าลบ → NaN → ffill ได้ 7 จากคอลัมน์ One? ไม่ ffill แนวตั้งต่อคอลัมน์ |
หมายเหตุ: ffill() ทำงานต่อคอลัมน์ (Column-wise) ไม่ใช่ข้ามคอลัมน์
การวิเคราะห์คอลัมน์ 'two' แยกต่างหาก
# Column 'two' ต้นฉบับ: [-6, -1, 2, -8]
# 1. mask: [NaN, NaN, 2, NaN]
# 2. ffill: [NaN, NaN, 2, 2] (NaN แถวแรก-สองไม่มีค่าก่อนหน้า)
# 3. fillna(0): [0, 0, 2, 2]
# 4. astype: [0, 0, 2, 2] ✓
การประยุกต์ใช้
- ทำความสะอาดข้อมูลเซ็นเซอร์ (Sensor Data Cleaning)
- Financial Data: แทนที่ราคาลบ/ผิดปกติ
- Time Series: Forward Fill Missing Values
- Data Validation: กำจัด Outlier ติดลบ
ตัวเลือก: Backward Fill (bfill)
# ใช้ค่าถัดไปแทน (ถ้าต้องการ)
df = df.mask(df.lt(0)).bfill().fillna(0).astype('int32')