如何在 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
我尝试用正向填充方法结合折扣率或递减率 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