首页 > 解决方案 > Python Pandas:如何根据过滤器将数字序列分配为列?

问题描述

我正在尝试将一个顺序的数字列表作为一个基于过滤器的列分配给一个名为的工作时间数据框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 中实现这个输出?我尝试过使用范围,但它的工作方式似乎不同:

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

标签: pythonpandaslisttime-series

解决方案


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

推荐阅读