Найдите задержку в днях и замените 0 на pandas с задержкой в последний день

#python #pandas #dataframe #pandas-groupby

#python #pandas #фрейм данных #pandas-groupby

Вопрос:

У меня есть df, содержащий столбцы employee , worked_days и sold, которые какой-то сотрудник продал только в первый день, а через пять дней продал другой

Мои данные выглядят так

 data = {'id':[1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2], 
    'days':[1, 3, 3, 8, 8,8, 3, 8, 8, 9, 9, 12],
    'sold':[1, 0, 1, 1, 1, 0, 0, 1, 1, 2, 0, 1]}
df = pd.DataFrame(data) 
df['days_lag'] = df.groupby('id')['days'].diff().fillna(0).astype('int16')
 

Дает мне это

     id  days  sold  days_lag
0    1     1     1         0
1    1     3     0         2
2    1     3     1         0
3    1     8     1         5
4    1     8     1         0
5    1     8     0         0
6    2     3     0         0
7    2     8     1         5
8    2     8     1         0
9    2     9     2         1
10   2     9     0         0
11   2    12     1         3
 

Я хочу, чтобы результаты были такими, как показано ниже

     id  days  sold  days_lag
0    1     1     1         0
1    1     3     0         2
2    1     3     1         2
3    1     8     1         5
4    1     8     1         5
5    1     8     0         5
6    2     3     0         0
7    2     8     1         5
8    2     8     1         5
9    2     9     2         1
10   2     9     0         1
11   2    12     1         3
 

Как я могу этого добиться?
Спасибо

Ответ №1:

Используйте Groupby.transform :

 In [92]: df['days_lag'] = df.groupby('id')['days'].diff().fillna(0).astype('int16')
In [96]: df['days_lag'] = df.groupby(['id', 'days'])['days_lag'].transform('max')

In [97]: df
Out[97]: 
    id  days  sold  days_lag
0    1     1     1         0
1    1     3     0         2
2    1     3     1         2
3    1     8     1         5
4    1     8     1         5
5    1     8     0         5
6    2     3     0         0
7    2     8     1         5
8    2     8     1         5
9    2     9     2         1
10   2     9     0         1
11   2    12     1         3