Thay thế các giá trị âm trong DataFrame bằng giá trị dương gần nhất đứng trước nó (trên cùng cột). Nếu không có giá trị dương trước đó, thay bằng 0. Sử dụng masking, forward fill (ffill()) và fillna(0).
Tạo DataFrame có giá trị âm
import pandas as pd
df = pd.DataFrame({'One': [-3, 7, 4, 0], 'two': [-6, -1, 2, -8]})
print("DataFrame gốc:\n", df)
Xử lý giá trị âm
# 1. mask(df.lt(0)): che phủ (mask) các giá trị < 0 thành NaN
# 2. ffill(): forward fill - lan truyền giá trị trước đó xuống dưới
# 3. fillna(0): điền 0 cho các NaN còn lại (không có giá trị dương trước đó)
# 4. astype('int32'): chuyển về kiểu nguyên
df = df.mask(df.lt(0)).ffill().fillna(0).astype('int32')
print("\nDataFrame sau xử lý:\n", df)
Kết quả
DataFrame gốc: One two 0 -3 -6 1 7 -1 2 4 2 3 0 -8 DataFrame sau xử lý: One two 0 0 0 1 7 0 2 4 2 3 0 2
Giải thích từng bước
| Bước | Cột One | Cột two |
|---|---|---|
| Gốc | -3, 7, 4, 0 | -6, -1, 2, -8 |
| mask(lt 0) | NaN, 7, 4, 0 | NaN, NaN, 2, NaN |
| ffill() | NaN, 7, 4, 0 | NaN, NaN, 2, 2 |
| fillna(0) | 0, 7, 4, 0 | 0, 0, 2, 2 |
Kết quả cột "One" hàng 0: -3 → NaN → không có giá trị trước → fillna(0) → 0.
Cột "two" hàng 3: -8 → NaN → ffill lấy giá trị 2 từ hàng 2 → 2.