温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python 3.x - Pandas creating and filling new columns based on other columns
dataframe pandas python-3.x

python 3.x - pandas 根据其他列创建和填充新列

发布于 2020-03-27 10:37:19

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

如果能得到帮助,我将不胜感激。

查看更多

查看更多

提问者
akash bachu
被浏览
190
YOBEN_S 2019-07-03 22:09

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