【问题标题】:Count the number of events in Python计算 Python 中的事件数
【发布时间】:2019-12-28 14:19:49
【问题描述】:

继续我之前的Question,我需要更多帮助。

数据框是这样的

time eve_id  sub_id   flag
0      5      2        0
1      5      2        0
2      5      2        1
3      5      2        1
4      5      2        0
5      4      25       0
6      4     30        0
7      5      2        1

我需要在时间标志从 0 变为 1 时计算 eve_id, 并计算 eve_id 时间标志为 1 到 1

输出将如下所示

time   flag  count
0       0      2
2       1      2
4       0      3

有人可以帮我吗?

【问题讨论】:

    标签: python pandas dataframe data-manipulation


    【解决方案1】:

    首先我们创建一个分组指示器,检查两行之间的difference 是否为not equal 到0,这表示存在差异。

    然后我们在这个指标上分组并使用agg。由于pandas 0.25.0 我们有named aggregations

    s = df['flag'].diff().ne(0).cumsum()
    
    grpd = df.groupby(s).agg(time=('time', 'first'),
                             flag=('flag', 'first'),
                             count=('flag', 'size')).reset_index(drop=True)
    

    输出

       time  flag  count
    0     0     0      2
    1     2     1      2
    2     4     0      3
    3     7     1      1
    

    如果time 是您的索引,请使用:

    grpd = df.assign(time=df.index).groupby(s).agg(time=('time', 'first'),
                                                   flag=('flag', 'first'),
                                                   count=('flag', 'size')).reset_index(drop=True)
    

    注意:额外的行是因为最后一行和前一行之间也存在差异

    【讨论】:

      【解决方案2】:

      将聚合函数 sum 更改为 GroupBy.size

      df1 = (df.groupby([df['flag'].ne(df['flag'].shift()).cumsum(), 'flag'])
               .size()
               .reset_index(level=0, drop=True)
               .reset_index(name='count'))
      print (df1)
         flag  count
      0     0      2
      1     1      2
      2     0      3
      3     1      1
      

      【讨论】:

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