通过使用pandas移动唯一的值来导出结束日期。

问题描述 投票:0回答:1

我有一个数据框架,如下图所示

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

我希望我的输出是如下图所示。

enter image description here

python pandas dataframe pandas-groupby lag
1个回答
1
投票

使用。

#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
© www.soinside.com 2019 - 2024. All rights reserved.