假设我具有以下数据框。
A B
0 NaN 12
1 NaN NaN
2 24 NaN
3 NaN NaN
4 NaN 13
5 NaN 11
6 NaN 13
7 18 NaN
8 19 NaN
9 17 NaN
在“ A”列中,如果缺失的值存在,则需要用序列中的3个最接近的非空值的平均值替换。
例如,索引5的NaN 以18作为其最接近的非空值,而在18之后,接下来的两个值也非空。因此索引5的NaN被(18 + 19 + 17)/ 3取代。
索引4 处的NaN具有24作为最接近的非空值,但24之前的两个值非空。因此,索引4的NaN不会替换为任何值。
同样,其余列也需要完成此操作。有人知道这样做的矢量化方式吗?
谢谢!
答案 0 :(得分:0)
我认为您需要将mean
与前一轮相结合,然后使用DataFrame.interpolate
将NaN
中最近的mean
替换为NaN
,最后一组向前填充c
的数量,并为辅助DataFrame a = df.rolling(3).mean()
b = df.iloc[::-1].rolling(3).mean()
c = a.fillna(b).fillna(df).interpolate(method='nearest').ffill().bfill()
print (c)
A B
0 24.0 12.000000
1 24.0 12.000000
2 24.0 12.000000
3 24.0 12.333333
4 24.0 12.333333
5 18.0 11.000000
6 18.0 12.333333
7 18.0 12.333333
8 19.0 12.333333
9 18.0 12.333333
df = df.fillna(c)
print (df)
A B
0 24.0 12.000000
1 24.0 12.000000
2 24.0 12.000000
3 24.0 12.333333
4 24.0 13.000000
5 18.0 11.000000
6 18.0 13.000000
7 18.0 12.333333
8 19.0 12.333333
9 17.0 12.333333
的第一组NaN进行回填,用于替换原始DataFrame的缺失值:
$('body').on('click', '.deleteLayer', function () {
var layer_id = $(this).data('id');
confirm("Are You sure want to delete record with layer_id="+layer_id+"?");
$.ajax({
type: "POST",
url: "{{ route('layers.destroy',['layer' => "+layer_id+"])}}",
data: {_method: 'delete', layer:layer_id},
success: function (data) {
table.draw();
},
error: function (data) {
console.log('Error:', data);
}
});
});
});