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

Posted

技术标签:

【中文标题】如何在 pandas DataFrame 中以衰减速率前向填充 NaN 值【英文标题】:How to forward-fill NaN values at a decaying rate in a pandas DataFrame 【发布时间】:2022-01-07 02:33:34 【问题描述】:

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

我有以下数据集:

    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

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

非常感谢!

【问题讨论】:

【参考方案1】:

通过计算连续的 NaN 序列 using this groupby/cumsum idea 来创建指数掩码:

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

然后ffillmultiply 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

【讨论】:

以上是关于如何在 pandas DataFrame 中以衰减速率前向填充 NaN 值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sse 中实现有符号定点数学中向零的衰减?

如何在 Pandas 中遍历 DataFrame 中的行

如何在 Pandas 中遍历 DataFrame 中的行

Pandas:如何将 cProfile 输出存储在 pandas DataFrame 中?

带有衰减的 Pandas 数据帧前向填充

如何在 jupyter 中像 pandas Dataframe 一样打印 Pyspark Dataframe