【问题标题】:Group by and find consecutive time and create a flag in Python分组并查找连续时间并在Python中创建标志
【发布时间】:2017-03-01 20:02:16
【问题描述】:

以下是我拥有的数据,

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、名称和时间,因此我希望两个值都为 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 循环并遍历所有值并检查条件。但我认为应该有一个有效的解决方案,因为我需要为数百万行找到它。

谁能帮我解决这个问题?

谢谢

【问题讨论】:

  • 您的数据存储在文本文件或其他文件中?
  • @chiheb Nexus 我从 .csv 导入并将其作为数据框。
  • 检查itertools groupby 并尝试找到解决方案

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


【解决方案1】:

一种方法可能是仅使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多