如何在 pandas DataFrame 中以衰减率前向填充 NaN 值

How to forward-fill NaN values at a decaying rate in a pandas DataFrame

我尝试用正向填充方法结合折扣率或递减率 0.9 来替换 pandas DataFrame 中的 NaN 值。

我有以下数据集:

    Column1 Column2 Column3 Column4
0   1.0     5       -9.0    13.0
1   NaN     6       -10.0   15.0
2   3.0     7       NaN     NaN
3   NaN     8       NaN     NaN

为了可重复性:

df1 = pd.DataFrame({
                    'Column1':[1, 'NaN', 3, 'NaN'], 
                    'Column2':[5, 6, 7, 8], 
                    'Column3':[-9, -10, 'NaN', 'NaN'], 
                    'Column4':[13, 15, 'NaN', 'NaN']
                    })
df1 = df1.replace('NaN',np.nan)

我能够用 fillna 命令和前向填充 ffill 方法替换 NaN 值。

df2 = df1.fillna(method='ffill')

    Column1 Column2 Column3 Column4
0   1.0 5   -9.0    13.0
1   1.0 6   -10.0   15.0
2   3.0 7   -10.0   15.0
3   3.0 8   -10.0   15.0

此外,我正在尝试将比率 0.9 应用于所有前向填充的 NaN 值,这将产生以下数据集:

NaN 值第 2 行第 3 列:-10 * 0.9 = -9

NaN 值第 3 行第 3 列:-9 * 0.9 = -8.1

    Column1 Column2 Column3 Column4
0   1.0     5       -9.0    13.00
1   0.9     6       -10.0   15.00
2   3.0     7       -9.0    13.50
3   2.7     8       -8.1    12.15

有没有简单的方法来解决这个问题?

非常感谢!

通过计算连续的 NaN 序列来创建指数掩码 :

groups = df1.notna().cumsum()
exp = df1.apply(lambda col: col.isna().groupby(groups[col.name]).cumsum())

#    Column1  Column2  Column3  Column4
# 0        0        0        0        0
# 1        1        0        0        0
# 2        0        0        1        1
# 3        1        0        2        2

然后 ffill and multiply 通过 0.9 ** exp:

df2 = df1.ffill().mul(0.9 ** exp)

#    Column1  Column2  Column3  Column4
# 0      1.0      5.0     -9.0    13.00
# 1      0.9      6.0    -10.0    15.00
# 2      3.0      7.0     -9.0    13.50
# 3      2.7      8.0     -8.1    12.15