在多列上进行转换以插值/复制缺失值

4

我正在尝试通过插值或在组内(由trip标识)复制最后已知值来填充pandas数据帧中的缺失值。我的数据看起来像这样:

    brake   speed   trip
0   0.0     NaN     1
1   1.0     NaN     1
2   NaN     1.264   1
3   NaN     0.000   1
4   0.0     NaN     1
5   NaN     1.264   1
6   NaN     6.704   1
7   1.0     NaN     1
8   0.0     NaN     1
9   NaN     11.746  2
10  1.0     NaN     2
11  0.0     NaN     2
12  NaN     16.961  3
13  1.0     NaN     3
14  NaN     11.832  3
15  0.0     NaN     3
16  NaN     17.082  3
17  NaN     22.435  3
18  NaN     28.707  3
19  NaN     34.216  3

我发现了一个关于在分组内使用Pandas插值的Stack Overflow帖子,但我需要简单地将 brake 从最后已知的值复制,而 speed 则需要进行插值处理(我的实际数据集有12列都需要这种处理)。

1个回答

4

您可以为每个列应用不同的方法。例如:

# interpolate speed
df['speed'] = df.groupby('trip').speed.transform(lambda x: x.interpolate())
# fill brake with last known value 
df['brake'] = df.groupby('trip').brake.transform(lambda x: x.fillna(method='ffill'))

>>> df
    brake    speed  trip
0     0.0      NaN     1
1     1.0      NaN     1
2     1.0   1.2640     1
3     1.0   0.0000     1
4     0.0   0.6320     1
5     0.0   1.2640     1
6     0.0   6.7040     1
7     1.0   6.7040     1
8     0.0   6.7040     1
9     NaN  11.7460     2
10    1.0  11.7460     2
11    0.0  11.7460     2
12    NaN  16.9610     3
13    1.0  14.3965     3
14    1.0  11.8320     3
15    0.0  14.4570     3
16    0.0  17.0820     3
17    0.0  22.4350     3
18    0.0  28.7070     3
19    0.0  34.2160     3

请注意,这意味着在制动方面仍然存在一些NaN,因为在行程的第一行中没有“最后已知值”,而在速度方面,当前几行是NaN时也会出现一些NaN。您可以使用fillna()自行替换这些值。

1
这其实没问题。我总是忘记可以对单独的列进行操作。这是最快的方法吗?我有大约600万行数据;这个解决方案对我来说需要1分30秒,但如果有更快的方法,我非常感兴趣。 - retorquere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接