我有Pandas数据帧描述GPS数据,其中列表示轨道索引,点索引(沿轨道的点位置)和纬度/经度值(显示为" xx"为简洁起见。
track point lat lon
1 1 xx xx
1 2 xx xx
1 3 xx xx
2 1 xx xx
2 2 xx xx
2 3 xx xx
... ... .. ..
我希望通过track
进行切片,然后按point
排序。到目前为止,我是在一个循环中这样做,但我想知道这是否正确(我猜不是,因为它看起来并不高效):
trks = getDataframe() //dataframe is created elsewhere
tracks = [] //this is what I want: some sequence of individual tracks
for trk in sorted(set(trks.trk)):
track = trks[(trks.track==trk)
track.sort(columns='point')
tracks.append(track)
答案 0 :(得分:1)
您可以使用groupby
:
tracks = [grp.sort(['point']) for key, grp in trks.groupby(['track'])]
例如,
In [236]: trks = pd.read_table('data', sep='\s+')
In [237]: trks
Out[237]:
track point lat lon
0 1 2 xx xx
1 1 3 xx xx
2 1 1 xx xx
3 2 1 xx xx
4 2 3 xx xx
5 2 2 xx xx
In [239]: for key, grp in trks.groupby(['track']):
.....: print(grp.sort(['point']))
.....:
track point lat lon
2 1 1 xx xx
0 1 2 xx xx
1 1 3 xx xx
track point lat lon
3 2 1 xx xx
5 2 2 xx xx
4 2 3 xx xx
请注意,将所有数据保存在一个DataFrame中通常更有效。一旦将DataFrame分解为较小的片段列表,那么无论何时想要对所有帧执行某些操作,都必须使用Python循环。这往往会减慢计算速度。如果你能找到一种方法来表达你的计算作为整体应用于DataFrame的东西,你通常会做得更好。