Как вычесть последовательные строки фрейма данных pandas с последним обновленным значением

#python

#python

Вопрос:

У меня есть данные временного ряда, в которые мне нужно добавить строку на основе даты последнего обновления столбца этапа. И у меня есть повторение данных: например

 Id    Date            Stage   

1   20-12-2013    Basic

1   20-10-2015    Basic

1   05-12-2018    Advanced

2   20-05-2019    Basic

2   15-12-2019    Advanced

3   20-01-2020    Advanced

4   20-10-2020    Basic

4   20-12-2020    Advanced
  

Ожидаемый результат :

 Id  Date          Stage     Stage Changed Since

1   20-12-2013    Basic       NaN

1   20-10-2015    Basic       NaN 

1   05-12-2018    Advanced  05-12-2018 - 20-10-2015

2   20-05-2019    Basic       NaN

2   15-12-2019    Advanced  15-12-2019  - 20-05-2019

3   20-01-2020    Advanced    NaN

4   20-10-2020    Basic       NaN

4   20-12-2020    Advanced  20-12-2020 - 20-10-2020 
  

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

Ответ №1:

Оформить заказ https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas .DataFrame.shift.html

Вы могли бы создать 2 сдвинутых вниз столбца для stage и date и выполнить сравнение

 d = {
    1: {'date': datetime(2010, 10, 10), 'stage': 'basic'},
    2: {'date': datetime(2010, 11, 10), 'stage': 'basic'},
    3: {'date': datetime(2010, 12, 10), 'stage': 'advanced'},
}

df = pd.DataFrame(d).T

# created shifted columns
df['stage_lagged'] = df['stage'].shift(1)
df['date_lagged'] = df['date'].shift(1)

# compare values
df.loc[df['stage'] != df['stage_lagged'], 'stage_changed_since'] = df['date_lagged']

# convert the date column to a date type
df['stage_changed_since'] = pd.to_datetime(df['stage_changed_since'])

df = df[['date', 'stage', 'stage_changed_since']]

  

И вы получаете

         date     stage stage_changed_since
1 2010-10-10     basic                 NaT
2 2010-11-10     basic                 NaT
3 2010-12-10  advanced          2010-11-10
  

Комментарии:

1. В основном, когда этап изменяется в пределах одного и того же идентификатора, мне нужно получить количество дней с момента изменения этапа. И этап изменен, поскольку столбец должен показывать это.