分组依据、查找连续时间并在Python中创建标志

wgeznvg7  于 2023-03-09  发布在  Python
关注(0)|答案(2)|浏览(86)

以下是我所拥有的数据,

id  name    unused      time
1   a         1     2/21/2017 18:01:31.168
1   a         2     2/21/2017 18:01:31.168
1   a         3     2/21/2017 18:11:44.054
1   a         4     2/21/2017 18:19:03.147
1   b         5     2/21/2017 18:19:03.147
1   b         6     2/21/2017 21:55:43.927
1   b         7     2/21/2017 22:10:29.699
1   b         8     2/21/2017 22:10:29.699
2   a         9     2/21/2017 23:36:30.239
2   a        10     2/21/2017 23:45:40.005
2   a        11     2/22/2017 00:05:43.466
2   a        12     2/22/2017 00:05:43.466
2   b        13     2/22/2017 00:16:00.646
2   b        14     2/22/2017 11:43:16.250
2   b        15     2/22/2017 11:43:16.250
2   b        16     2/22/2017 14:02:10.531

我想用id,name和连续的时间戳来分组,并为它创建一个标志。例如,第1行和第2行有相同的id,name和time,所以我想用1来表示这两个值,如果它不连续,它应该是0。
以下是我试图实现的输出,

id  name    unused      time               flag
1   a         1     2/21/2017 18:01:31.168  1
1   a         2     2/21/2017 18:01:31.168  1
1   a         3     2/21/2017 18:11:44.054  0
1   a         4     2/21/2017 18:19:03.147  0
1   b         5     2/21/2017 18:19:03.147  0
1   b         6     2/21/2017 21:55:43.927  0
1   b         7     2/21/2017 22:10:29.699  1
1   b         8     2/21/2017 22:10:29.699  1
2   a         9     2/21/2017 23:36:30.239  0
2   a        10     2/21/2017 23:45:40.005  0
2   a        11     2/22/2017 00:05:43.466  1
2   a        12     2/22/2017 00:05:43.466  1
2   b        13     2/22/2017 00:16:00.646  0
2   b        14     2/22/2017 11:43:16.250  1
2   b        15     2/22/2017 11:43:16.250  1
2   b        16     2/22/2017 14:02:10.531  0

以下是我的尝试,
我试着把它分类,

data.sort_values(['id', 'name', 'time'])

然后我想把它分组,

data.sort_values(['id', 'name', 'time']).groupby(['id', 'name'])

但是我不能在那之后创建标志,我在想一个解决方案,我可以写一个for循环,循环所有的值,检查条件,但是我认为应该有一个有效的解决方案,因为我需要找到百万行的标志。
有人能帮我解决这个问题吗?
谢谢

wgx48brx

wgx48brx1#

一种方法是使用shift将一个向前的列和一个向后的列与感兴趣的列进行比较。

eval_cols = df[['id', 'name', 'time']]
df['flag'] = ((eval_cols == eval_cols.shift()).all(1) | 
              (eval_cols == eval_cols.shift(-1)).all(1)).astype(int)

演示

>>> ((eval_cols == eval_cols.shift()).all(1) | 
     (eval_cols == eval_cols.shift(-1)).all(1)).astype(int)

0     1
1     1
2     0
3     0
4     0
5     0
6     1
7     1
8     0
9     0
10    1
11    1
12    0
13    1
14    1
15    0
dtype: int32
mctunoxg

mctunoxg2#

col1=df1[['id','name','time']].astype(str).apply('*'.join,1)
col2=col1.ne(col1.shift()).cumsum()
df1.assign(flag=col2).groupby(col2).apply(lambda dd:dd.assign(flag=1) if len(dd)>=2 else dd.assign(flag=0))

输出:

id  name    unused      time               flag
1   a         1     2/21/2017 18:01:31.168  1
1   a         2     2/21/2017 18:01:31.168  1
1   a         3     2/21/2017 18:11:44.054  0
1   a         4     2/21/2017 18:19:03.147  0
1   b         5     2/21/2017 18:19:03.147  0
1   b         6     2/21/2017 21:55:43.927  0
1   b         7     2/21/2017 22:10:29.699  1
1   b         8     2/21/2017 22:10:29.699  1
2   a         9     2/21/2017 23:36:30.239  0
2   a        10     2/21/2017 23:45:40.005  0
2   a        11     2/22/2017 00:05:43.466  1
2   a        12     2/22/2017 00:05:43.466  1
2   b        13     2/22/2017 00:16:00.646  0
2   b        14     2/22/2017 11:43:16.250  1
2   b        15     2/22/2017 11:43:16.250  1
2   b        16     2/22/2017 14:02:10.531  0

相关问题