Сдвиг значений за 1… N предыдущих месяцев в виде отдельных столбцов

1

У меня есть следующие данные:

import pandas as pd
import numpy as np

data = pd.DataFrame({
    'proj': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
    'date': ['2018-08-01', '2018-09-01', '2018-10-01', '2018-11-01', '2018-12-01', '2019-01-01', '2018-06-01', '2018-07-01', '2018-08-01', '2018-09-01'],
    'value': [10, 3, 15, 16, -20, 2, 1, 3, 3, 0]
})

Изображение 174551

и в конце я хотел бы иметь:

expected = pd.DataFrame({
    'proj': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
    'date': ['2018-08-01', '2018-09-01', '2018-10-01', '2018-11-01', '2018-12-01', '2019-01-01', '2018-06-01', '2018-07-01', '2018-08-01', '2018-09-01'],
    'value': [10, 3, 15, 16, -20, 2, 1, 3, 3, 0],
    'prev_month_value': [np.NaN, 10, 3, 15, 16, -20, np.NaN, 1, 3, 3],
    'prev_prev_month_value': [np.NaN, np.NaN, 10, 3, 15, 16, np.NaN, np.NaN, 1, 3]
})

Изображение 174551

Как это сделать в пандах?

Теги:
pandas
datetime
pandas-groupby
group-by

1 ответ

1
Лучший ответ

Вы можете вызывать GroupBy.shift в понимании dict и concat результаты после:

N = 2

g = data.groupby('proj')
u = pd.DataFrame({
    ('prev_'*i) + 'month_value': g['value'].shift(i) for i in range(1, N + 1)})
pd.concat([data, u], axis=1)

 proj        date  value  prev_month_value  prev_prev_month_value
0    A  2018-08-01     10               NaN                    NaN
1    A  2018-09-01      3              10.0                    NaN
2    A  2018-10-01     15               3.0                   10.0
3    A  2018-11-01     16              15.0                    3.0
4    A  2018-12-01    -20              16.0                   15.0
5    A  2019-01-01      2             -20.0                   16.0
6    B  2018-06-01      1               NaN                    NaN
7    B  2018-07-01      3               1.0                    NaN
8    B  2018-08-01      3               3.0                    1.0
9    B  2018-09-01      0               3.0                    3.0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню