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())
我试图将一个连续的数字列表作为一个基于过滤器的列分配给一个名为 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())