2014-09-30 4 views
0

У меня есть Dataframe Pandas, описывающий данные GPS, где столбцы представляют индекс трека, индекс точки (положение точки вдоль дорожки) и значения lat/lon (для краткости отображаются как «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. Как только вы разбиваете DataFrame на список меньших частей, тогда всякий раз, когда вы хотите что-то сделать ко всем кадрам, вы должны использовать цикл Python. Это приводит к замедлению расчета. Обычно вам будет лучше, если вы сможете найти способ выразить свои вычисления как нечто, применимое к DataFrame в целом.

Смежные вопросы