首页 > 解决方案 > 从 Pandas Dataframe 中的最后一个有效行填充无效的 x,y 位置数据

问题描述

假设我有一个如下数据框:

time    id  x   y
0   1   23.1    12.7
0   2   12.2    32
0   3   232.2   76.3
1   1   -9999   -9999
1   2   98      55.7
1   3   67      54
2   1   56.8    56.8
2   2   99      -9999
2   3   443.4   34

x 或 y 列中等于 -9999 的值无效。我想将此值更改为与前一个 ['time'] 值的 row['id'] 值匹配的值。例如,在时间 = 2 时 id = 3 的 y 值无效的行希望在时间 = 1 时将 y 值替换为 id = 3。

这将变成如下:

time    id  x   y
0   1   23.1    12.7
0   2   12.2    32
0   3   232.2   76.3
1   1   23.1    12.7
1   2   98      55.7
1   3   67      54
2   1   56.8    56.8
2   2   99      55.7
2   3   443.4   34

我将如何处理这个(最好没有迭代)?我已经查看了 ffill 方法,但我不确定如何在指定它应该从先前匹配的 id 号填充时使其工作。我相信第一步是将 -9999 值填充为 NA,但我不确定如何从那里开始。

几点注意事项:

谢谢!

标签: pythonpandasdataframe

解决方案


如果时间值是连续的,您可以用-9999每组前向填充的缺失值替换缺失值:

df[['x','y']] = df[['x','y']].replace(-9999, np.nan).groupby(df['id']).ffill()
print (df)
   time  id      x     y
0     0   1   23.1  12.7
1     0   2   12.2  32.0
2     0   3  232.2  76.3
3     1   1   23.1  12.7
4     1   2   98.0  55.7
5     1   3   67.0  54.0
6     2   1   56.8  56.8
7     2   2   99.0  55.7
8     2   3  443.4  34.0

推荐阅读