假设我有一个数据帧,如下所示:
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