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

Python – แทนที่ค่าลบด้วยค่าบวกล่าสุดก่อนหน้าใน Pandas DataFrame

บทความนี้สาธิตวิธีแทนที่ค่าลบใน 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')