Python Pandas:如何根据过滤器将数字序列分配为列?

Python Pandas: how to assign a sequence of numbers as a column based off a filter?

我试图将一个连续的数字列表作为一个基于过滤器的列分配给一个名为 work 的工作时间数据框;目的是产生一个与演出的每个开始相关联的唯一 ID。下面是带有 gig_status column 的原始集合,显示车辆中的工人的演出何时开始:

   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_status 中“开始”值的记录都会分配一个序列。

如何在 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 和过滤数据集的长度之间。

尝试通过 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())