测试案例:
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
答案 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