2014-09-30 101 views
0

我有Pandas數據幀描述GPS數據,其中列表示軌跡索引,點索引(沿軌跡的點位置)和緯度/經度值(爲簡潔起見,顯示爲「xx」。從Pandas數據框中獲取序列

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

您可以使用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分解爲一個更小的部分列表,那麼無論何時您想對所有框架執行某些操作,都必須使用Python循環。這往往會減慢計算。如果您可以找到一種方法將計算表達爲適用於DataFrame的整體,那麼通常會做得更好。