У меня есть фрейм данных, как показано ниже
df1 = pd.DataFrame({'person_id': [11, 21, 31, 41, 51],
'date_1': ['12/30/1961', '05/29/1967', '02/03/1957', '7/27/1959', '01/13/1971'],
'date_2': ['07/23/2017','05/29/2017','02/03/2015',np.nan,np.nan]})
df1 = df1.melt('person_id', value_name='dates')
df1['dates'] = pd.to_datetime(df1['dates'])
df1 = df1.assign(pd= (df1['dates'].dt.dayofyear - 1),
nd=((df1['dates'] + pd.offsets.YearEnd(1)) - df1['dates']).dt.days)
С помощью этого сообщения я могу достичь части того, что я хотел.
Теперь то, что я хотел бы сделать, это
a) Сдвинуть даты назад (вычесть) на основе minimum of pd value
для каждого предмета b) Сдвинуть даты вперед (добавить) на основе minimum of nd value
для каждого предмета c) Проверьте, остается ли компонент year
одинаковым между 3 столбцами dates
, shift_forward
и shift_backward
Итак, я получил minimum of pd and nd values
, используя приведенный ниже код
min_pd = df1.groupby(['person_id'])['pd'].min()
min_nd = df1.groupby(['person_id'])['nd'].min()
year_change = df1.dates.dt.year.eq(df1.shift_backward.dt.year(df1.shift_forward.dt.year))
, но не уверен, как я могу использовать эти min_pd
и min_nd
в качестве смещения даты для каждого объекта.
Я ожидаю, что мой результат будет таким, как показано ниже
