python:如何根据筛选器将数字序列指定为列?

0s0u357o  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(288)

我试图将一个连续的数字列表作为一个基于过滤器的列分配给一个称为 work ; 其目的是生成一个唯一的id,该id与gig的每个开始绑定。下面是一套带有 gig_status column 显示车辆中工人的gig启动时间:

worker   veh   gig_status               starttime                stoptime
0  11133y  QQUK1     start            2018-12-21 15:17:29     2018-12-21 15:18:57
1  44706h  FF243     start            2019-01-01 00:10:16     2019-01-01 00:16:32
2  44706h  FF243                      2019-01-01 00:27:11     2019-01-01 00:31:38
3  44706h  FF243                      2019-01-01 00:46:20     2019-01-01 01:04:54
4  44761y  LL525     start            2019-01-01 00:19:06     2019-01-01 00:39:43
5  44842q  OO454     start            2019-01-01 00:12:35     2019-01-01 00:19:09
6  44842q  OO454                      2019-01-01 00:47:55     2019-01-01 01:00:01
7  44842q  OO454                      2019-01-01 01:12:47     2019-01-01 02:01:50
8  46090u  OP324     start            2019-01-01 00:16:23     2019-01-01 00:39:46
9  46090u  OP324                      2019-01-01 00:58:02     2019-01-01 01:19:02

以下是我预期的初始输出:

worker       veh    gig_status          starttime                stoptime.      gig_id
0  11133y      QQUK1     start         2018-12-21 15:17:29     2018-12-21 15:18:57    1
1  44706h      FF243     start         2019-01-01 00:10:16     2019-01-01 00:16:32    2
2  44706h      FF243                   2019-01-01 00:27:11     2019-01-01 00:31:38   
3  44706h      FF243                   2019-01-01 00:46:20     2019-01-01 01:04:54
4  44761y      LL525     start         2019-01-01 00:19:06     2019-01-01 00:39:43    3
5  44842q      OO454     start         2019-01-01 00:12:35     2019-01-01 00:19:09    4
6  44842q      OO454                   2019-01-01 00:47:55     2019-01-01 01:00:01    
7  44842q      OO454                   2019-01-01 01:12:47     2019-01-01 02:01:50    
8  46090u      OP324     start         2019-01-01 00:16:23     2019-01-01 00:39:46    5
9  46090u      OP324                   2019-01-01 00:58:02     2019-01-01 01:19:02

然后,我们的想法是使用一个前向填充将每条记录绑定到它的新id。
在里面 R 使用 data.table() 这很简单,写出来如下:

work[gig_status=="start", gig_id:=seq.Int(.N)]

基本上,为符合gig_状态中“开始”值的每个记录分配一个序列。
如何在python中实现此输出?我尝试过使用range,但效果似乎不一样:


# produce the length of the subset dataframe

x = len(work.loc[work.gig_status == 'start'])

# produce a listed range from 0 to that length and assign as a new column

work['gig_id'] = work.loc[work.gig_status == 'start'] = list(range(0,x)

我得到的gig_id不在0和过滤数据集的长度之间。

azpvetkf

azpvetkf1#

尝试通过 cumsum()mask() :

df['gig_id']=df['gig_status'].eq('start').cumsum().mask(df['gig_status'].isna())

# OR via where() but with opposite condition

df['gig_id']=df['gig_status'].eq('start').cumsum().where(df['gig_status'].notna())


通过 loc 存取器和 cumsum() :

m=df['gig_status'].eq('start')
df.loc[df['gig_status'].notna() & m,'gig_id']=m.cumsum()


# import numpy as np

df['gig_id']=np.where(df['gig_status'].isna(),np.nan,df['gig_status'].eq('start').cumsum())

相关问题