通过使用 pandas 移动唯一值得出结束日期

Derive end date by shifting unique values using pandas

我有一个如下所示的数据框

df = pd.DataFrame({'subjectID' :[1,1,1,1,1,1,2,2,2],'start_date': 
  ['10/30/2006 08:04','10/30/2006 08:04','11/30/2006 11:01','12/30/2006 02:04','02/13/2007 07:24','04/20/2007 08:34',
   '02/20/2007 06:44','01/20/2007 03:44','11/09/2006 02:03']})

我想做的是

1) 按两列对数据框进行排序(每个主题的 subject_id 和 start_date)。 意思是每个科目的开始日期必须按升序排列。按 subject_id 分组并对其 start_date 值进行排序

2) 通过获取同一患者的 start_date 的下一个唯一值,为每位患者填写 end_date 列。

3) 当我们按照步骤 2 进行时,我们会遇到每个主题的最后一条记录没有其他值,所以 我们只需添加 10 天以获得最后一条记录的结束日期每个科目

这是我试过的

df = df.sort_values(['subjectID', 'start_date'], ascending=[True,True]) # works but is this same as group by and sort after?
df['end_date'] = df.groupby('subjectID')['start_date'].unique().shift(-1) # this doesn't work

我希望我的输出如下所示

使用:

#converting to datetimes
df['start_date'] = pd.to_datetime(df['start_date'])

#sorting
df = df.sort_values(['subjectID', 'start_date'])
#created timestamp for each last value of group and added 10 days
s = df.drop_duplicates('subjectID', keep='last')['start_date'] + pd.Timedelta(10, unit='d')

#shifting without duplicates, added missing values by reindex and forward filling 
df['end_date'] = (df.drop_duplicates(['subjectID','start_date'])
                   .groupby('subjectID')['start_date']
                   .shift(-1)
                   .reindex(df.index)
                   .groupby(df['subjectID'])
                   .ffill()
                   )
#last set last values of groups
df['end_date'].update(s)
print (df)
  subjectID          start_date            end_date
0          1 2006-10-30 08:04:00 2006-11-30 11:01:00
1          1 2006-10-30 08:04:00 2006-11-30 11:01:00
2          1 2006-11-30 11:01:00 2006-12-30 02:04:00
3          1 2006-12-30 02:04:00 2007-02-13 07:24:00
4          1 2007-02-13 07:24:00 2007-04-20 08:34:00
5          1 2007-04-20 08:34:00 2007-04-30 08:34:00
8          2 2006-11-09 02:03:00 2007-01-20 03:44:00
7          2 2007-01-20 03:44:00 2007-02-20 06:44:00
6          2 2007-02-20 06:44:00 2007-03-02 06:44:00