Как сделать предыдущие и следующие столбцы в dataframe из существующего dataframe?

catris25:

Итак, допустим, у меня есть кадр данных, как это.

df = pd.DataFrame({'person':['A', 'A', 'B', 'B', 'A'],
                   'datetime':['2018-02-26 10:49:32', '2018-02-26 10:58:03', '2018-02-26 10:51:10','2018-02-26 10:58:45', '2018-02-26 10:43:34'], 
                   'location':['a', 'b', 'c', 'd', 'e']})

Это показывает

person  datetime    location
    A   2018-02-26 10:49:32 a
    A   2018-02-26 10:58:03 b
    B   2018-02-26 10:51:10 c
    B   2018-02-26 10:58:45 d
    A   2018-02-26 10:43:34 e

Тогда я отсортирован их в зависимости от каждого человека и времени

df.sort_values(by=['person', 'datetime'])

Какой бы сортирует движение каждого человека, то их время.

person  datetime    location
4   A   2018-02-26 10:43:34 e
0   A   2018-02-26 10:49:32 a
1   A   2018-02-26 10:58:03 b
2   B   2018-02-26 10:51:10 c
3   B   2018-02-26 10:58:45 d

Что может быть прочитано как человек А идет от места е, а затем переходит к, а затем переходит к Ь. В то же время человек В идет от места С, затем к месту д.

Я хочу, чтобы создать dataframe, который отслеживает движение каждого человека, как это.

| person | prev_datetime       | prev_loc | next_datetime       | next_loc |
|--------|---------------------|----------|---------------------|----------|
| A      | 2018-02-26 10:43:34 | e        | 2018-02-26 10:49:32 | a        |
| A      | 2018-02-26 10:49:32 | a        | 2018-02-26 10:58:03 | b        |
| B      | 2018-02-26 10:51:10 | c        | 2018-02-26 10:58:45 | d        |

Я на самом деле не имел ни малейшего представления, как это сделать. Спасибо.

Изреель:

Использование DataFrameGroupBy.shiftна 2 колонки, и последний Вытащите последнего продублированы строк по personстолбцу, Series.duplicatedс renameколонками:

df['datetime'] = pd.to_datetime(df['datetime'])
df1 = df.sort_values(by=['person', 'datetime'])

df1[['next_datetime','next_loc']] = df1.groupby('person')['datetime','location'].shift(-1)
d = {'datetime':'prev_datetime','location':'prev_loc'}
df2 = df1[df1['person'].duplicated(keep='last')].rename(columns=d)
print (df2)
  person       prev_datetime prev_loc       next_datetime next_loc
4      A 2018-02-26 10:43:34        e 2018-02-26 10:49:32        a
0      A 2018-02-26 10:49:32        a 2018-02-26 10:58:03        b
2      B 2018-02-26 10:51:10        c 2018-02-26 10:58:45        d

рекомендация

отhttp://43.154.161.224:23101/article/api/json?id=373122&siteId=1