【问题标题】:Pandas cumulative count [duplicate]熊猫累计计数[重复]
【发布时间】:2016-11-30 23:34:03
【问题描述】:

我有一个这样的数据框:

0        04:10  obj1
1        04:10  obj1
2        04:11  obj1
3        04:12  obj2
4        04:12  obj2
5        04:12  obj1
6        04:13  obj2

想要获得所有对象的累积计数,如下所示:

idx      time   object   obj1_count   obj2_count 
0        04:10  obj1        1             0
1        04:10  obj1        2             0
2        04:11  obj1        3             0
3        04:12  obj2        3             1
4        04:12  obj2        3             2
5        04:12  obj1        4             2
6        04:13  obj2        4             3

尝试玩 cumsum 但不确定这是正确的方法。有什么建议吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    这种操作有一个特殊的函数:cumcount

    >>> df = pd.DataFrame([['a'], ['a'], ['a'], ['b'], ['b'], ['a']], columns=['A'])
    >>> df
       A
    0  a
    1  a
    2  a
    3  b
    4  b
    5  a
    >>> df.groupby('A').cumcount()
    0    0
    1    1
    2    2
    3    0
    4    1
    5    3
    dtype: int64
    >>> df.groupby('A').cumcount(ascending=False)
    0    3
    1    2
    2    1
    3    1
    4    0
    5    0
     dtype: int64
    

    【讨论】:

      【解决方案2】:

      您只需将该列与感兴趣的值进行比较,然后调用cumsum

      In [12]:
      df['obj1_count'] = (df['object'] == 'obj1').cumsum()
      df['obj2_count'] = (df['object'] == 'obj2').cumsum()
      df
      
      Out[12]:
            time object  obj1_count  obj2_count
      idx                                      
      0    04:10   obj1           1           0
      1    04:10   obj1           2           0
      2    04:11   obj1           3           0
      3    04:12   obj2           3           1
      4    04:12   obj2           3           2
      5    04:12   obj1           4           2
      6    04:13   obj2           4           3
      

      这里比较会产生一个布尔系列:

      In [13]:
      df['object'] == 'obj1'
      
      Out[13]:
      idx
      0     True
      1     True
      2     True
      3    False
      4    False
      5     True
      6    False
      Name: object, dtype: bool
      

      当您在上面调用 cumsum 时,True 值将转换为 1False0 并累加求和

      【讨论】:

      • 这个比内置的cumcount()快吗?
      【解决方案3】:

      您可以通过获取pd.get_dummiescumsum 来概括此过程。这应该适用于您要计算的任意数量的对象,而无需单独指定每个对象:

      # Get the cumulative counts.
      counts = pd.get_dummies(df['object']).cumsum()
      
      # Rename the count columns as appropriate.
      counts = counts.rename(columns=lambda col: col+'_count')
      
      # Join the counts to the original df.
      df = df.join(counts)
      

      结果输出:

          time object  obj1_count  obj2_count
      0  04:10   obj1           1           0
      1  04:10   obj1           2           0
      2  04:11   obj1           3           0
      3  04:12   obj2           3           1
      4  04:12   obj2           3           2
      5  04:12   obj1           4           2
      6  04:13   obj2           4           3
      

      如果可以使用 count 作为前缀而不是后缀,则可以省略 rename 步骤,即 'count_obj1' 而不是 'obj1_count'。只需使用pd.get_dummiesprefix参数即可:

       counts = pd.get_dummies(df['object'], prefix='count').cumsum()
      

      【讨论】:

        【解决方案4】:

        这是一种使用 numpy 的方法

        u, iv = np.unique(
            df.object.values,
            return_inverse=True
        )
        
        objcount = pd.DataFrame(
            (iv[:, None] == np.arange(len(u))).cumsum(0),
            df.index, u
        )
        pd.concat([df, objcount], axis=1)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-14
          • 2018-10-30
          • 1970-01-01
          • 2021-02-28
          • 2019-10-14
          • 2020-12-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多