如何在 3X3 windows 中 select 具有 NaN 值的单元格周围的值?

How to select values around the cell with NaN value in a 3X3 windows?

我有一个以下的熊猫数据框。我需要一个代码来遍历数据帧并找到每个 NaN 值并在 3X3 windows 中提取它周围的所有相邻像素并将提取的数据帧保存到新数据帧中,其中也包含 NaN 值。

import pandas as pd
import numpy as np

d= {1: [5, 5.11, 5.6, 5.9, 4.8, 6], 3: [4, 5, 15, 25, 40, 10],6: [77, 47, 55, 59, np.nan,  5],
    7: [np.nan, 32, 40, 33, 30, 6],9: [10, 11, 12, 45, 14, 15],15: [3, 5, 9, 12, 11, 12]}            

data_miss=pd.DataFrame(data=d)

示意图见下图:

在此图中,绿色和黄色两个矩形显示了每个 NaN 值周围的选定值。我需要一个考虑边界中的 NaN 值的代码,并且不会像绿色矩形中的选定值那样在边界中遇到错误,仅选择了数据框中的值。另外,考虑到列索引不是连续的数字。

将您的数据框转换为 numpy 数组:

>>> a      # a <- data_miss.values
array([[ 2.,  6.,  4., nan,  6.,  8.],
       [ 8.,  4.,  7.,  9.,  3.,  6.],
       [ 6.,  2.,  1.,  5.,  3.,  9.],
       [ 2.,  8.,  5.,  8.,  9.,  3.],
       [ 1.,  5., nan,  9.,  3.,  8.],
       [ 2.,  9.,  6.,  8.,  4.,  4.]])

定义函数:

convolve_window = lambda x, y: a[max(x-1, 0):min(x+2, a.shape[0]),
                                 max(y-1, 0):min(y+2, a.shape[1])]

提取大约 nan 个值:

>>> [convolve_window(x, y) for x, y in np.argwhere(np.isnan(a))]
[array([[ 4., nan,  6.],
        [ 7.,  9.,  3.]]),
 array([[ 8.,  5.,  8.],
        [ 5., nan,  9.],
        [ 9.,  6.,  8.]])]

如果您想用均值替换 nan,请应用 np.nanmean()

>>> np.nanmean(convolve...)
[5.8, 7.25]