从Pandas数据帧中最后一个有效行填充无效的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']值的行['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,但我不确定如何从那里开始。

注意事项:

  • 数据按时间顺序排列
  • 在每个时间步长,可能有不同数量的id值(例如,我不能只用第3行的值填充它(
  • id值在每个时间步长内可能不按任何顺序排列

谢谢!

如果时间值是连续的,您可以将-9999替换为缺失值,并按组向前填充misisng值:

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

最新更新