Сдвиг времени с использованием Timedelta
Другой ответ сдвигается по числовому индексу.Работает в этом случае, но он сломается, если в датах есть пробелы, или если даты не были отсортированы.
Вы можете справиться с этим, преобразовав DataFrame во временной ряд, а затем используя freq
параметр DataFrame.shift()
с pandas.Timedelta
объектом.
Пример данных:
import pandas as pd
df = pd.DataFrame({'date': ['2014-01-01'] * 3 +
['2014-01-02'] * 3 +
['2014-01-03'] * 3,
'id': ['A', 'B', 'C'] * 3,
'score': [75, 1, 2, 84, 1, 3, 1, 1, 1]})
df.date = pd.to_datetime(df.date)
df.set_index('date', inplace=True)
Идентификаторы означают, что нам нужна пара циклов, чтобы все было отдельно:
for i in range(5):
for id in df.id.unique():
col = 'date_{}'.format(i+1)
freq = pd.Timedelta('{}d'.format(i+1))
df.loc[df.id==id, col] = df.loc[df.id==id, 'score'].shift(freq=freq)
df[col] = df[col].fillna(0).astype(int)
Это приводит к тому же выводу, что и в другом подходе в этом примере, но если у вас есть пропуск в дате, он будет другим.
Вывод:
id score date_1 date_2 date_3 date_4 date_5
date
2014-01-01 A 75 0 0 0 0 0
2014-01-01 B 1 0 0 0 0 0
2014-01-01 C 2 0 0 0 0 0
2014-01-02 A 84 75 0 0 0 0
2014-01-02 B 1 1 0 0 0 0
2014-01-02 C 3 2 0 0 0 0
2014-01-03 A 1 84 75 0 0 0
2014-01-03 B 1 1 1 0 0 0
2014-01-03 C 1 3 2 0 0 0