Разделите Pandas DataFrame на секции между строками, которые удовлетворяют условию - PullRequest
0 голосов
/ 29 мая 2018

У меня есть DataFrame из нескольких поездок, который выглядит примерно так:

   TripID  Lat    Lon    time  delta_t
0  1       53.55  9.99   74    1
1  1       53.58  9.99   75    1
2  1       53.60  9.98   76    5
3  1       53.60  9.98   81    1
4  1       53.58  9.99   82    1
5  1       53.59  9.97   83    NaN
6  2       52.01  10.04  64    1
7  2       52.34  10.05  65    1
8  2       52.33  10.07  66    NaN

Как вы можете видеть, у меня есть записи о местоположении и времени, которые все относятся к некоторой поездке, идентифицированной поездкойЯ БЫ.Я также вычислил delta_t как время, которое проходит до записи, следующей за поездкой.Последней записи каждой поездки присваивается NaN как delta_t.

Теперь мне нужно убедиться, что шаг времени моих записей одинаков для всех моих данных.Я пошел с одной единицей времени для этого примера.По большей части поездки удовлетворяют этому условию, но время от времени у меня есть одна запись, например, запись №.2, в другом прекрасном путешествии это не так.

Вот почему я хочу просто разделить мою поездку на две поездки на данный момент.Это все равно застряло.Кажется, я не могу найти хороший способ сделать это.

Чтобы рассматривать каждую поездку отдельно, я думал о чем-то вроде этого:

 for key, grp in df.groupby('TripID'): 
     # split trip at too long delta_t(s)

Однако фактическое расщепление внутрипетля - это то, что я не знаю, как сделать.По сути, мне нужно назначить новый идентификатор поездки для каждой записи от одной большой delta_t до следующей (или до конца поездки) или выполнить какую-либо операцию группировки, которая может группировать эти большие delta_t.

Я знаю, что это довольно специфическая проблема.Я надеюсь, что у кого-то есть идея, как это сделать.

Я думаю, что новыми NaN, которые потом понадобятся, можно сначала пренебречь, а потом легко добавить с помощью этой строки (которая, как я знаю, работаетдля восходящих идентификаторов поездки):

 df.loc[df['TripID'].diff().shift(-1) > 0, 'delta_t'] = np.nan

1 Ответ

0 голосов
/ 29 мая 2018

IIUC, петля не нужна.Следующее создает новый столбец с именем new_TripID на основе 2 условий: что исходный TripID изменяется с одной строки на следующую или что разница в вашем столбце time больше, чем на

df['new_TripID'] = ((df['TripID'] != df['TripID'].shift()) | (df.time.diff() > 1)).cumsum()

>>> df
   TripID    Lat    Lon  time  delta_t  new_TripID
0       1  53.55   9.99    74      1.0           1
1       1  53.58   9.99    75      1.0           1
2       1  53.60   9.98    76      5.0           1
3       1  53.60   9.98    81      1.0           2
4       1  53.58   9.99    82      1.0           2
5       1  53.59   9.97    83      NaN           2
6       2  52.01  10.04    64      1.0           3
7       2  52.34  10.05    65      1.0           3
8       2  52.33  10.07    66      NaN           3

Обратите внимание, что из вашего описания и ваших данных видно, что вы действительно могли бы использовать groupby, и вам, вероятно, стоит поискать его для других манипуляций.Однако в конкретном случае, о котором вы просите, это не нужно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...