熊猫根据其他列创建和填充新列

时间:2019-07-03 13:38:27

标签: python-3.x pandas dataframe

我有一个带有时间和值列的熊猫数据框。我正在尝试创建两个新列“ 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

如果能得到帮助,我将非常感谢。

2 个答案:

答案 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_TIMEEND_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