【问题标题】:Sequence for an event based on time in pandas dataframe熊猫数据框中基于时间的事件序列
【发布时间】:2018-07-13 04:01:50
【问题描述】:

我有一个时间序列数据,我想根据时间和另一个类别值找到某个事件的序列。

例子: 时间事件类别序列 1 一个 1 1 2 一个 1 2 3 乙 1 1 4 乙 2 1 5 C 1 1 6 一个 1 1

我搜索并发现我可以使用 groupby 和 cumcount() 来执行此操作,但我无法在上面的示例中实现时间 1 和时间 6 的序列(同类别和不同时间的事件 A 应该有一个新的序列号,我的代码继续序列并输出为 3)

df['sequence']=df.groupby('Event').cumcount() + 1

相关问题:

Pandas: conditional rolling count(考虑单列情况)

【问题讨论】:

  • 'Event' 分组和累积计数应该将[1, 2, 1, 2, 1, 3] 作为您的新sequence 列。如果这不是您所期望的,您还期望什么?
  • 我需要按事件、类别和时间对序列进行分组。例如 - 对于事件 A,类别 1,时间 1 和 2 的顺序分别为 1 和 2。并且在时间 6 下一次出现的 A1 应该又是 1。同样对于事件 B,类别 1 和 2 在时间 3 和 4 都应该是 1。我希望我的解释现在很清楚。提前致谢
  • 感谢您指出这一点。您的问题与此有关:stackoverflow.com/questions/25119524/… 但由于您要求多列案例,我将为此添加答案。

标签: python pandas sequence pandas-groupby


【解决方案1】:

你可以这样。鉴于这些数据

df = pd.DataFrame({'Time': [1, 2, 3, 4, 5, 6],
                   'Event': list('AABBCA'),
                   'Category': [1, 1, 1, 2, 1, 1]})

您想按'Event''Category' 分组,然后按cumcount。为了重新开始计数,您可以使用shift(1) 比较连续的行,并使用any(axis=1)cumsum() 保存信息。然后总命令读取

>>> df['Seq'] = df.groupby((df[['Event', 'Category']] != df[['Event', 'Category']].shift(1)).any(axis=1).cumsum()).cumcount() + 1
>>> df
   Time Event  Category  Seq
0     1     A         1    1
1     2     A         1    2
2     3     B         1    1
3     4     B         2    1
4     5     C         1    1
5     6     A         1    1

注意:'Time' 列似乎只是您的索引,可能会被跳过。虽然我把它包括在内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多