我有一个数据框架,如下图所示
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)填充 end_date列,通过获取同一患者的start_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