以下是我的数据,
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
我想用id,name分组并查找连续的时间戳并为其创建一个标志。例如,第1行和第2行具有相同的id,名称和时间,因此我想要两个值,如果它不连续,则它应该为0.
以下是我想要实现的输出,
data.sort_values(['id', 'name', 'time'])
以下是我的尝试,
我正在尝试对它进行排序,
data.sort_values(['id', 'name', 'time']).groupby(['id', 'name'])
然后我想把它分组,
; with data as (
select 2017 as yr, 1 as period
union all
select 2017 as yr, 2 as period
)
, temp as (
select
yr,
period,
dateadd(day, -1, dateadd(month, 1,
convert(datetime, cast(yr*10000 + period*100 + 1 as varchar))
)
) as test
from data
)
select yr, period, convert(varchar(10), test, 126) from temp
但之后我无法创建旗帜。我正在考虑一个解决方案,我可以编写一个for循环并循环遍历所有值并检查条件。但我认为应该有一个有效的解决方案,因为我需要找到它的百万行。
有人可以帮我解决这个问题吗?
由于
答案 0 :(得分:2)
一种方法可能是使用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