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