1

我尝试用前向填充方法以及折扣率或 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

有没有简单的方法来处理它?

非常感谢!

4

1 回答 1

2

通过使用此 groupby/cumsum 思想计算连续的 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_multiply0.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
于 2021-11-30T11:52:34.423 回答