如何在 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]
我有一个以下的熊猫数据框。我需要一个代码来遍历数据帧并找到每个 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]