我有一个python函数,它可以处理坐标序列(轨迹数据)。它要求数据采用以下格式。
#items = [Item(x1, y1), Item(x2, y2), Item(x3, y3), Item(x4, y4)]
items = [Item(0.5, 0.5), Item(-0.5, 0.5), Item(-0.5, -0.5), Item(0.5, -0.5)]
还需要从上面的项中找到xmin,ymin,xmax,ymax,并为下面的边界框指定它。
spindex = pyqtree.Index(bbox=[-1, -1, 1, 1])
#bbox = [xmin,ymin,xmax,ymax]
现在,项目插入如下。
#Inserting items
for item in items:
spindex.insert(item, item.bbox)
我们现在可以看到,所有上述操作都是在项目中指定的单个坐标序列上执行的。我需要在具有多个轨迹的数据框上执行上述步骤,每个轨迹都有多个点序列,并由id vid 标识。
样本df如下:
vid x y
0 1 2 3
1 1 3 4
2 1 5 6
3 2 7 8
4 2 9 10
5 3 11 12
6 3 13 14
7 3 15 16
8 3 17 18
在上面的数据框中,x,y是坐标数据,属于同一“vid”的所有点形成一个单独的轨迹;因此可以观察到属于voyage id(vid)的行(0-2) = 1是一个轨迹,而属于vid = 2的点是另一个轨迹,依此类推。
上述数据也可以转换为以下df(仅在需要时):
vid (x,y)
0 1 [ (2,3),(3,4), (5,6) ]
1 2 [ (7,8),(9,10) ]
2 3 [ (11,12),(13,14),(15,16),(17,18) ]
我想创建一种循环遍历df的方法,也许可以使用 vid 对它们进行分组,并将所有坐标作为项并找到xmin,xmax,ymin,ymax并按照上面的说明为df中的每个轨迹插入它们。
我有一个像这样的代码,但它不起作用
for group in df.groupby('vid'):
bbox = [ group['x'].min(), group['y'].min(), group['x'].max(), group['y'].max() ]
spindex.insert(group['vid'][0], bbox)
请帮助。
答案 0 :(得分:1)
Gourpby return((gkeys),grouped_dataframe)
将您的代码修改为以下内容:
for g in df.groupby('vid'):
vid = g[0]
g_df = g[1]
bbox = [ g_df['x'].min(), g_df['y'].min(), g_df['x'].max(), g_df['y'].max() ]
spindex.insert(vid, bbox)