Python 数据帧前向填充衰减
我正在运行Python 3.5和Pandas v 0.19.2。我有一个如下所示的数据帧。正向填充缺少的值是直接的Python 数据帧前向填充衰减,python,pandas,missing-data,fillna,Python,Pandas,Missing Data,Fillna,我正在运行Python 3.5和Pandas v 0.19.2。我有一个如下所示的数据帧。正向填充缺少的值是直接的 import pandas as pd import numpy as np d = {'A': np.array([10, np.nan, np.nan, -3, np.nan, 4, np.nan, 0]), 'B': np.array([np.nan, np.nan, 5, -3, np.nan, np.nan, 0, np.nan ])} df = pd.Dat
import pandas as pd
import numpy as np
d = {'A': np.array([10, np.nan, np.nan, -3, np.nan, 4, np.nan, 0]),
'B': np.array([np.nan, np.nan, 5, -3, np.nan, np.nan, 0, np.nan ])}
df = pd.DataFrame(d)
df_filled = df.fillna(axis='index', method='ffill')
print(df_filled)
Out[8]:
A B
0 10.0 NaN
1 10.0 NaN
2 10.0 5.0
3 -3.0 -3.0
4 -3.0 -3.0
5 4.0 -3.0
6 4.0 0.0
7 0.0 0.0
我的问题是:实现衰减正向填充的最佳方法是什么?我理解pd.ffill()
和pd.fillna()
不支持这一点。例如,我所追求的输出如下所示(与上面的常规ffill相反),其中每个周期的值减半:
Out[5]:
A B
0 10.0 NaN
1 5.0 NaN
2 2.5 5.0
3 -3.0 -3.0
4 -1.5 -1.5
5 4.0 -0.75
6 2.0 0.0
7 0.0 0.0
是的,没有简单的方法可以做到这一点。我建议使用
groupby
和apply
一次只做一列
for c in df:
df[c] = df[c].groupby(df[c].notnull().cumsum()).apply(
lambda y: y.ffill() / 2 ** np.arange(len(y))
)
有一个向量解。它部分地使用了这个
编辑:在我的实验中,这个解决方案比另一个快1.8倍。将结果与完整的
df
进行比较应该很有趣。嗨,衰变在这里应该如何工作?只有以前值的一半?是的,举个例子,只有以前值的一半。我已经添加了常规的ffill()
输出和所需的比较。无论如何,您可以要求将其添加为上的功能。末尾有一个额外的括号,它返回此错误NameError:name'x'未定义
谢谢,我明天早上将尝试这两种方法(使用大DF)
df
A B
0 10.0 NaN
1 5.0 NaN
2 2.5 5.00
3 -3.0 -3.00
4 -1.5 -1.50
5 4.0 -0.75
6 2.0 0.00
7 0.0 0.00
import pandas as pd
import numpy as np
d = {'A': np.array([10, np.nan, np.nan, -3, np.nan, 4, np.nan, 0]),
'B': np.array([np.nan, np.nan, 5, -3, np.nan, np.nan, 0, np.nan ])}
df = pd.DataFrame(d)
decay_rate = 2
ddf = df.isnull().cumsum().diff().fillna(0)
ddf = ddf!=0
ddf = ddf.cumsum() - ddf.cumsum()\
.where(~ddf)\
.ffill()\
.fillna(0)
df_filled = df.ffill()/(ddf * decay_rate).replace(0, 1)