通过使用 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
我有一个如下所示的数据框
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