熊猫:将numpy.nan单元格替换为最多的非nan相邻单元格

时间:2018-10-28 14:33:32

标签: python pandas

测试案例:

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

2 个答案:

答案 0 :(得分:9)

您可以沿指定的每个方向填充NaN并取最大值:

pd.concat([
    df.ffill(limit=1), 
    df.ffill(axis=1, limit=1), 
    df.bfill(limit=1), 
    df.bfill(axis=1, limit=1)]
).max(level=0)

这假定您在初始DataFrame中具有唯一的行标签。

答案 1 :(得分:9)

您可以在两个方向上使用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