如何在 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
然后ffill
和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
【讨论】:
以上是关于如何在 pandas DataFrame 中以衰减速率前向填充 NaN 值的主要内容,如果未能解决你的问题,请参考以下文章