Построить фрейм данных с последовательными временными рядами - PullRequest
3 голосов
/ 23 октября 2019

У меня есть набор данных, который содержит много временных отметок, связанных с различными кораблями и портами.

   obj_id   timestamp   port
0  4        2019-10-01  Houston    
1  2        2019-09-01  New York 
2  4        2019-07-31  Boston   
3  1        2019-07-28  San Francisco
4  2        2019-10-15  Miami
5  1        2019-09-01  Honolulu
6  1        2019-08-01  Tokyo

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

   obj_id   origin_time origin_port     destination_time   destination_port
0  4        2019-07-31  Boston          2019-10-01         Houston
1  2        2019-09-01  New York        2019-10-15         Miami
3  1        2019-07-28  Tokyo            2019-09-01         Honolulu

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

df.sort_values(by ='timestamp', ascending = False).drop_duplicates(['obj_id'])

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Вы хотите отсортировать поездки по отметке времени, чтобы мы могли получить самые последние рейсы, затем сгруппировать рейсы по идентификатору объекта и захватить первое и второе путешествие по объекту, а затем объединить.

groups = df.sort_values(by = "timestamp", ascending = False).groupby("obj_id")
pd.merge(groups.nth(1), groups.nth(0),
         on="obj_id",
         suffixes=("_origin", "_dest"))

Makeхотя ваш столбец меток времени имеет правильный тип данных меток времени, иначе ваша сортировка будет испорчена.

0 голосов
/ 23 октября 2019

Использование groupby.agg с first, last:

dfg = df.sort_values('timestamp').groupby('obj_id').agg(['first', 'last']).reset_index()
dfg.columns = [f'{c1}_{c2}' for c1, c2 in dfg.columns]

   obj_id_ timestamp_first timestamp_last     port_first port_last
0        1      2019-07-28     2019-09-01  San Francisco  Honolulu
1        2      2019-09-01     2019-10-15       New York     Miami
2        4      2019-07-31     2019-10-01         Boston   Houston
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...