我有一个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 值大/小得多)。
你可以尝试理解平均数背后的逻辑,即几何级数
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),这就是关键
| 归档时间: |
|
| 查看次数: |
2325 次 |
| 最近记录: |