分组并查找连续时间并在Python中创建一个标志

时间:2017-03-01 20:02:16

标签: python python-2.7 python-3.x pandas dataframe

以下是我的数据,

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循环并循环遍历所有值并检查条件。但我认为应该有一个有效的解决方案,因为我需要找到它的百万行。

有人可以帮我解决这个问题吗?

由于

1 个答案:

答案 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