用衰减公式插值/填充

2024-04-19 03:16:00 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下数据帧:

>>> import pandas as pd
>>> df = pd.DataFrame([1,2,4, None, None, None, None, -1, 1, None, None])
>>> df
      0
0   1.0
1   3.0
2   4.0
3   NaN
4   NaN
5   NaN
6   NaN
7  -1.0
8   1.0
9   NaN
10  NaN

我想用从上一个值开始的指数衰减来填充缺失的值,给出:

>>> df_result
      0
0   1.0
1   2.0
2   4.0
3   4.0 # NaN replaced with previous value
4   2.0 # NaN replaced previous value / 2
5   1.0 # NaN replaced previous value / 2
6   0.5 # NaN replaced previous value / 2
7  -1.0
8   1.0
9   1.0 # NaN replaced previous value
10  0.5 # NaN replaced previous value / 2

有了fillna,我就有了method='pad',但是我不能在这里拟合我的公式。 对于interpolate,我不确定是否可以给出一个具体的指数衰减公式,并且只考虑最后的not NaN值。你知道吗

我正在考虑创建一个单独的数据帧df_replacements,用0.5而不是NaN和其他地方的0初始化,执行一个cumprod(我需要为每个第一个NaN将正在运行的产品重置为1),然后df_result = df.fillna(df_replacements, inplace=True)

有没有一个简单的方法来取代熊猫?你知道吗


Tags: 数据importnonepandasdfvalueresultnan
1条回答
网友
1楼 · 发布于 2024-04-19 03:16:00

在您的例子中,填充nan向前,然后我们groupby找到连续的NaN,得到cumcount

s=df[0].ffill()
df[0].fillna(s[df[0].isnull()].mul((1/2)**(df[0].groupby(df[0].notnull().cumsum()).cumcount()-1),0))
Out[655]: 
0     1.0
1     2.0
2     4.0
3     4.0
4     2.0
5     1.0
6     0.5
7    -1.0
8     1.0
9     1.0
10    0.5
Name: 0, dtype: float64

按OP编辑:使用更显式变量名的相同解决方案:

ffilled = df[0].ffill()
is_na = df[0].isnull()
group_ids = df[0].notnull().cumsum()
mul_factors = (1 / 2) ** (df[0].groupby(group_ids).cumcount() - 1)
result = df[0].fillna(ffilled[is_na].mul(mul_factors, 0))

相关问题 更多 >