2016-03-28 5 views
1

В моей dataframe, давайте назовем его ДФ, у меня есть данные, что выглядит какPython: с помощью панд GroupBy уменьшить размерность в dataframe

serial gps_dt lat long dist 
1  25Mar x1 y1 Nan 
1  26Mar x2 y2 0.01 
1  27Mar x3 y3 1.25 (assume this is the 5th occurrence < 160) 
2  24Mar x4 y5 Nan 
2  25Mar x5 y5 2.1 
2  26Mar x6 y6 1.01 
2  27Mar x7 y7 175.2 
2  28Mar x8 y8 179.3 (assume this is the 5th occurrence > 160) 

И это продолжается. У меня уже есть серия, назовем ее check, которая говорит мне, если serial[i] == serial[i+1]. То, что я хочу сделать сейчас, это когда они равны, построить новый фрейм данных, который содержит serial, gps_dt_first, gps_dt_last, avg_lat, avg_long в условиях hdist < 160, и мы имеем по крайней мере 5 вхождений в этом радиусе. Если hdist > 160, я хочу построить другую группу, если и только если следующие 5 вхождений находятся в пределах 160 из первого больше, чем 160.

Например, вывод будет выглядеть примерно так:

serial gps_dt_first gps_dt_last avg_lat avg_long 
1  25Mar  27Mar  avg_x avg_y 
2  27Mar  28Mar  avg_x avg_y 

I Я смотрю документацию group by в Пандах. Данные уже находятся в serial, gps_dt порядке от SAS. Нужно ли еще делать df.groupby(['serial', 'gps_dt'])?

После ФР сгруппирована, если это необходимо, моя мысль о коде (больше псевдо кода контура):

if check == true and hdist < 160 and 5 or more occurrences (how to count the occurrences): 
    result['serial'] = df.serial (first in serial; how to extract) 
    result['gps_dt_first'] = df.gps_dt (first in gps_dt) 
    result['gps_dt_last'] = df.gps_dt (last in gps_dt) 
    result['avg_lat'] = df.lat.mean() (only for the subset of serial meeting criteria) 
    result['avg_long'] = df.long.mean() (same here) 
else if check == true and hdist > 160 and 5 or more occurrences; 
    do same as above 
else: 
    delete 

ответ

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