熊猫:用“ n”列中的平均值最接近的非空值替换NaN

时间:2019-08-07 11:13:03

标签: python pandas

假设我具有以下数据框。

     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不会替换为任何值。

同样,其余列也需要完成此操作。有人知道这样做的矢量化方式吗?
谢谢!

1 个答案:

答案 0 :(得分:0)

我认为您需要将mean与前一轮相结合,然后使用DataFrame.interpolateNaN中最近的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);
            }
        });
    });

  });