Python 按特定条件的发生对数据帧进行分组
我正试图分析一些熊猫无人机飞行的记录。日志有一个时间戳、无人机发送的消息和一些感官数据。每两条消息发送一个位置。现在,我希望在位置消息之前按顺序对所有行进行分组(或者换句话说,每次出现位置消息时,只需将整个数据帧拆分为组)。这些消息不一定以设定的频率出现 下面是一个简化的示例: 这个 应按如下方式进行分组:Python 按特定条件的发生对数据帧进行分组,python,pandas,Python,Pandas,我正试图分析一些熊猫无人机飞行的记录。日志有一个时间戳、无人机发送的消息和一些感官数据。每两条消息发送一个位置。现在,我希望在位置消息之前按顺序对所有行进行分组(或者换句话说,每次出现位置消息时,只需将整个数据帧拆分为组)。这些消息不一定以设定的频率出现 下面是一个简化的示例: 这个 应按如下方式进行分组: id timestamp message additional_sensor_value 12:10:46 1 12:10:44 speed
id timestamp message additional_sensor_value
12:10:46
1 12:10:44 speed 144
2 12:10:46 position 23
12:11:02
3 12:10:63 orientation 222
4 12:10:82 status 2
5 12:11:02 position 63
12:11:43
6 12:11:24 speed 52
7 12:11:43 position 127
我们的目标是获得每个位置的附加_传感器_值的平均值,以获得所有记录数据的散点图,而不仅仅是像我现在在下面的示例中看到的位置数据
如果您有任何其他建议如何以更好的方式解决此问题,我很乐意听到,但我尽量避免使用for循环,因为这些数据帧可能非常大(>1 mil.行),我希望尽可能快地保留它。通过比较
消息
创建帮助程序系列
,然后通过索引[::-1]
更改订单,并创建组,最后更改订单为原始:
g = df['message'].eq('position').iloc[::-1].cumsum().iloc[::-1]
for _, x in df.groupby(g, sort=False):
print (x['timestamp'].iat[-1])
print (x)
12:10:46
id timestamp message additional_sensor_value
0 1 12:10:44 speed 144
1 2 12:10:46 position 23
12:11:02
id timestamp message additional_sensor_value
2 3 12:10:63 orientation 222
3 4 12:10:82 status 2
4 5 12:11:02 position 63
12:11:43
id timestamp message additional_sensor_value
5 6 12:11:24 speed 52
6 7 12:11:43 position 127
如果需要与g
一起使用,如:
g = df['message'].eq('position').iloc[::-1].cumsum().iloc[::-1]
df = df.groupby(g, sort=False).agg(avg=('additional_sensor_value', 'mean'),
time = ('timestamp','last'))
print (df)
avg time
message
3 83.500000 12:10:46
2 95.666667 12:11:02
1 89.500000 12:11:43
不错。为了保持顺序,您可以在g中添加一个
.iloc[::-1]
,如下所示:df['message'].eq('position').iloc[::-1].iloc[::-1]
,这样您就可以避免groupby中的排序
,我认为剖析它以实际得到发生的情况需要一些时间,但它工作得很完美,非常感谢D(这篇文章也把我的声誉提升到了一个点,这样我就可以投票了,所以完全成功了!:D)
g = df['message'].eq('position').iloc[::-1].cumsum().iloc[::-1]
df = df.groupby(g, sort=False).agg(avg=('additional_sensor_value', 'mean'),
time = ('timestamp','last'))
print (df)
avg time
message
3 83.500000 12:10:46
2 95.666667 12:11:02
1 89.500000 12:11:43