首页 > 解决方案 > Pandas:用最大的非 nan 相邻单元格替换 numpy.nan 单元格

问题描述

测试用例:

df = pd.DataFrame([[np.nan, 2, np.nan, 0],
                    [3, 4, np.nan, 1],
                    [np.nan, np.nan, np.nan, 5],
                    [np.nan, 3, np.nan, 4]],
                    columns=list('ABCD'))

其中 A[i + 1, j], A[i - 1, j], A[i, j + 1], A[i, j - 1] 是与 A[i,j] 相邻的条目集。

总而言之,这是:

     A    B   C  D
0  NaN  2.0 NaN  0
1  3.0  4.0 NaN  1
2  NaN  NaN NaN  5
3  NaN  3.0 NaN  4

应该变成这样:

     A    B   C  D
0  3.0  2.0 2.0  0.0
1  3.0  4.0 4.0  1.0
2  3.0  4.0 5.0  5.0
3  3.0  3.0 4.0  4.0

标签: pythonpandas

解决方案


您可以rolling在两个方向上使用该方法,然后找到每个方向的最大值。然后您可以使用它来填充原始的缺失值。

df1 = df.rolling(3, center=True, min_periods=1).max().fillna(-np.inf)
df2 = df.T.rolling(3, center=True, min_periods=1).max().T.fillna(-np.inf)
fill = df1.where(df1 > df2).fillna(df2)
df.fillna(fill)

输出

     A    B    C  D
0  3.0  2.0  2.0  0
1  3.0  4.0  4.0  1
2  3.0  4.0  5.0  5
3  3.0  3.0  4.0  4

推荐阅读