【问题标题】:Count groups of values in Pandas series计算 Pandas 系列中的值组
【发布时间】:2019-07-19 21:16:20
【问题描述】:

我有一个 Pandas (pandas==0.23.4) 日期时间索引数据框 df,其中有一列名为 value_id

value_id 包含浮点值组(5.06.0)和 NaN 组。我想计算5.06.0 的连续组数。这些组必须至少包含三个连续的值。

例如:

In [1]: print df.value_id
timestamp
2019-01-06 17:42:08    NaN
2019-01-06 17:45:08    5.0
2019-01-06 17:48:08    5.0
2019-01-06 17:51:08    5.0
2019-01-06 17:54:08    NaN
2019-01-06 17:57:08    NaN
2019-01-06 18:00:08    NaN
2019-01-06 18:03:08    NaN
2019-01-06 18:06:08    NaN
2019-01-06 18:09:08    NaN
2019-01-06 18:12:08    6.0
2019-01-06 18:15:08    6.0
2019-01-06 19:54:09    NaN
2019-01-06 19:57:09    5.0
2019-01-06 20:00:08    5.0
2019-01-06 20:03:08    5.0
2019-01-06 20:06:09    NaN
2019-01-06 20:09:08    NaN
2019-01-06 20:12:08    NaN
2019-01-06 20:15:09    NaN
2019-01-06 20:18:08    NaN
2019-01-06 20:21:09    NaN
2019-01-06 20:24:09    NaN
2019-01-07 19:09:07    NaN
2019-01-07 19:12:06    NaN
2019-01-07 19:15:06    5.0
2019-01-07 19:18:06    5.0
2019-01-07 19:21:07    5.0
2019-01-07 19:24:07    5.0
2019-01-07 19:27:07    NaN
2019-01-07 19:30:07    NaN
2019-01-07 19:33:06    NaN
2019-01-07 19:36:07    NaN
2019-01-07 19:39:07    NaN
2019-01-07 19:42:06    NaN
2019-01-07 19:45:06    NaN
2019-01-07 19:48:06    NaN
2019-01-07 19:51:06    6.0
2019-01-07 19:54:07    6.0
2019-01-07 19:57:06    6.0
Name: value_id, dtype: float64

如果我有两个变量名为 count1(用于 5.0 值组)和 count2(用于 6.0 值组),则为上述示例分配的结果计数将是:

count1: 3

count2: 1

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    IIUC 使用cumsum 创建组密钥,然后我们只需执行value_counts

    s.groupby(s.isnull().cumsum()).value_counts().ge(3).sum(level=1)
    Out[1026]: 
    timestamp
    5.0    3.0
    6.0    1.0
    Name: timestamp, dtype: float64
    

    【讨论】:

      【解决方案2】:

      也许不是最优雅的,但您可以使用shift 来检查接下来的两项是否相同,以及前一项是否属于同一组:

      df['fives'] = ((df['timestamp'] == 5) & (df['timestamp'].shift(-1) == 5)
                      & (df['timestamp'].shift(-2) == 5)
                      & (df['timestamp'].shift(1) != 5)).astype(int)
      df['sixes'] = ((df['timestamp'] == 6) & (df['timestamp'].shift(-1) == 6)
                      & (df['timestamp'].shift(-2) == 6)
                      & (df['timestamp'].shift(1) != 6)).astype(int)
      
      df[['fives','sixes']].sum()
      
      fives    3
      sixes    1
      dtype: int64
      

      【讨论】:

      • 我想你打算拥有df['value_id']timestamp 是日期时间索引的名称。但是,是的,这行得通。
      • @PJW 这就是您的示例数据如何使用read_clipboard 复制到 pandas 中的 - 我有点懒得不重命名它。 WeNYoBen 的解决方案肯定更优雅。
      猜你喜欢
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 2018-10-28
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多