【问题标题】:How to select values around the cell with NaN value in a 3X3 windows?如何在 3X3 窗口中选择具有 NaN 值的单元格周围的值?
【发布时间】:2021-08-22 22:41:53
【问题描述】:

我有一个以下熊猫数据框。我需要一个代码来循环数据帧并找到每个 NaN 值并在 3X3 窗口中提取它周围的所有相邻像素,并将提取的数据帧保存到新的数据帧中,其中还包括 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 值,并且不会在边界中遇到错误,例如绿色矩形中的选定值,即只选择了数据框内的值。另外,请考虑列索引不是按顺序编号的。

【问题讨论】:

  • 你看过DataFrame.shift()吗?
  • 我认为我的问题有所不同。我们不能仅仅通过移动行和列来解决它。

标签: python pandas dataframe filter nan


【解决方案1】:

将您的数据框转换为 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]

【讨论】:

  • 感谢您的回答。这是一个很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-11-11
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
相关资源
最近更新 更多