В моей 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