python - 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 和过滤数据集的长度之间。
解决方案
尝试通过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())
推荐阅读
- azure - 为什么 CloudConfigurationManager.GetSetting 会锁定或以其他方式表现不佳
- google-apps-script - GAS - 从阵列中删除重复项的问题
- reactjs - 如何在 Gatsby 网站上正确实现 JSONP 表单提交
- linux - Bash 删除 .dat 文件中的特定行
- java - 尝试进行双向绑定会导致“无法反转错误”
- python - 通过 for 循环绘制数据框列
- sql - 使用 SQL 进行序列编号
- php - 在 foreach 循环中重置其值后,我的 php 变量恢复为原始值
- ansible - ANSIBLE:使用归档模块时如何处理时间戳?
- c++ - C++14:std::thread 中的 this_thread::sleep_for 防止 .so 卸载