Pandas:用前一个和下一个非缺失值的平均值动态替换 NaN 值

Jun*_*ang 5 python pandas

我有一个df带有NaN值的数据框,我想用前一个和下一个非缺失值的平均值动态替换它们。

In [27]: df 
Out[27]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3       NaN -2.027325  1.533582
4       NaN       NaN  0.461821
5 -0.788073       NaN       NaN
6 -0.916080 -0.612343       NaN
7 -0.887858  1.033826       NaN
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431
Run Code Online (Sandbox Code Playgroud)

例如,A[3]NaN这样其值应(-0.120211-0.788073)/ 2 = -0.454142。A[4]那么应该是 (-0.454142-0.788073)/2 = -0.621108。

因此,结果数据框应如下所示:

In [27]: df 
Out[27]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 -0.454142 -2.027325  1.533582
4 -0.621108 -1.319834  0.461821
5 -0.788073 -0.966089 -1.260202
6 -0.916080 -0.612343 -2.121213
7 -0.887858  1.033826 -2.551718
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431
Run Code Online (Sandbox Code Playgroud)

这是处理缺失值的好方法吗?我不能简单地用每列的平均值替换它们,因为我的数据是时间序列并且会随着时间的推移而增加。(初始值可能是 0 美元,最终值可能是 100000 美元,所以平均值是 50000 美元,这可能比 NaN 值大/小得多)。

WeN*_*Ben 2

你可以尝试理解平均数背后的逻辑,即几何级数

s=df.isnull().cumsum()
t1=df[(s==1).shift(-1).fillna(False)].stack().reset_index(level=0,drop=True)
t2=df.lookup(s.idxmax()+1,s.idxmax().index)
df.fillna(t1/(2**s)+t2*(1-0.5**s)*2/2)
Out[212]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 -0.454142 -2.027325  1.533582
4 -0.621107 -1.319834  0.461821
5 -0.788073 -0.966089 -1.260201
6 -0.916080 -0.612343 -2.121213
7 -0.887858  1.033826 -2.551718
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431
Run Code Online (Sandbox Code Playgroud)

解释:

第一个 NaN x/2+y/2=1

第二个 NaN 1st/2+y/2=2nd

第三个 NaN 第二个/2+y/2+3 个

然后x/(2**n)+y(1-(1/2)**n)/(1-1/2),这就是关键