我有一个带有时间和值列的熊猫数据框。我正在尝试创建两个新列“ START_TIME”和“ END_TIME”,这是与药物相关的数据,并且在数据库中的存储不佳,因此我试图对表格进行转换。 在这种情况下,为患者使用的药物始于2018-11-07 23:59:32,剂量值为80.o,所以我想捕捉一下,因为药物的开始时间和结束时间是第一个零最后一个值之后。那将是一轮药物治疗。每当一个新值开始时,它就被视为第二轮用药,我想按照前面所述的以下方式捕获开始时间和结束时间。
Time Values
2018-11-07 23:59:32 80.0
2018-11-08 04:35:09 80.0
2018-11-08 05:31:24 40.0
2018-11-24 18:29:30 0.0
2018-11-24 18:33:14 0.0
2018-11-26 17:39:31 20.0
2018-11-26 18:51:07 20.0
2018-11-26 21:04:35 0.0
2018-11-26 21:05:20 0.0
2018-11-26 21:13:44 0.0
2018-11-26 21:25:57 0.0
2018-11-29 02:19:57 7.0
2018-12-09 16:02:06 5.0
2018-12-09 16:33:03 2.5
2018-12-09 21:02:10 0.0
我相信,如果我从一个简单的步骤开始就失败了,那么就无法通过简单的for和if循环来完成它
for i in df['Values']:
if i+1 != 0:
df['START_TIME'] = df['TIME'].copy()
预期的DataFrame:
Time Values START_TIME END_TIME
2018-11-07 23:59:32 80.0 2018-11-07 23:59:32
2018-11-08 04:35:09 80.0
2018-11-08 05:31:24 40.0
2018-11-24 18:29:30 0.0 2018-11-24 18:29:30
2018-11-24 18:33:14 0.0
2018-11-26 17:39:31 20.0 2018-11-26 17:39:31
2018-11-26 18:51:07 20.0
2018-11-26 21:04:35 0.0 2018-11-26 21:04:35
2018-11-26 21:05:20 0.0
2018-11-26 21:13:44 0.0
2018-11-26 21:25:57 0.0
2018-11-29 02:19:57 7.0 2018-11-29 02:19:57
2018-12-09 16:02:06 5.0
2018-12-09 16:33:03 2.5
2018-12-09 21:02:10 0.0 2018-12-09 21:02:10
如果能得到帮助,我将非常感谢。
答案 0 :(得分:2)
IIUC使用diff
创建条件,则等于-1和1的值将是结束点和起始点
s=df.Values.eq(0).astype(int).diff().fillna(-1)
df.loc[s==-1,'START_TIME']=df.Time
df.loc[s==1,'END_TIME']=df.Time
df
Out[334]:
Time Values START_TIME END_TIME
0 2018-11-07 23:59:32 80.0 2018-11-07 23:59:32 NaT
1 2018-11-08 04:35:09 80.0 NaT NaT
2 2018-11-08 05:31:24 40.0 NaT NaT
3 2018-11-24 18:29:30 0.0 NaT 2018-11-24 18:29:30
4 2018-11-24 18:33:14 0.0 NaT NaT
5 2018-11-26 17:39:31 20.0 2018-11-26 17:39:31 NaT
6 2018-11-26 18:51:07 20.0 NaT NaT
7 2018-11-26 21:04:35 0.0 NaT 2018-11-26 21:04:35
8 2018-11-26 21:05:20 0.0 NaT NaT
9 2018-11-26 21:13:44 0.0 NaT NaT
10 2018-11-26 21:25:57 0.0 NaT NaT
11 2018-11-29 02:19:57 7.0 2018-11-29 02:19:57 NaT
12 2018-12-09 16:02:06 5.0 NaT NaT
13 2018-12-09 16:33:03 2.5 NaT NaT
14 2018-12-09 21:02:10 0.0 NaT 2018-12-09 21:02:10
答案 1 :(得分:2)
我们可以创建两个遮罩(m1&m2
),并使用这些遮罩有条件地创建您的START_TIME
和END_TIME
列:
m1 = (df['Values'].shift().eq(0) & df['Values'].ne(0)) | (df['Values'].index == 0)
m2 = df['Values'].shift(1).ne(0) & df['Values'].eq(0)
df['START_TIME'] = np.where(m1, df['Time'], np.datetime64('NaT'))
df['END_TIME'] = np.where(m2, df['Time'], np.datetime64('NaT'))
Time Values START_TIME END_TIME
0 2018-11-07 23:59:32 80.0 2018-11-07 23:59:32 NaT
1 2018-11-08 04:35:09 80.0 NaT NaT
2 2018-11-08 05:31:24 40.0 NaT NaT
3 2018-11-24 18:29:30 0.0 NaT 2018-11-24 18:29:30
4 2018-11-24 18:33:14 0.0 NaT NaT
5 2018-11-26 17:39:31 20.0 2018-11-26 17:39:31 NaT
6 2018-11-26 18:51:07 20.0 NaT NaT
7 2018-11-26 21:04:35 0.0 NaT 2018-11-26 21:04:35
8 2018-11-26 21:05:20 0.0 NaT NaT
9 2018-11-26 21:13:44 0.0 NaT NaT
10 2018-11-26 21:25:57 0.0 NaT NaT
11 2018-11-29 02:19:57 7.0 2018-11-29 02:19:57 NaT
12 2018-12-09 16:02:06 5.0 NaT NaT
13 2018-12-09 16:33:03 2.5 NaT NaT
14 2018-12-09 21:02:10 0.0 NaT 2018-12-09 21:02:10
说明:
m1
:检查上一行等于是否等于0,而当前行不等于0。或者我们是否位于第一行< / li>
m2
:检查下一行不是否等于0以及当前行是否等于0