根据索引从Pandas数据帧中获取序列

时间:2014-09-30 01:59:38

标签: pandas slice

我有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)

1 个答案:

答案 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的东西,你通常会做得更好。