【问题标题】:DataFrame groupby on sequence of values not exceeding thresholdDataFrame groupby 对不超过阈值的值序列进行分组
【发布时间】:2017-04-29 20:00:11
【问题描述】:

我有一个包含两列的数据框。

data=DataFrame({'a':[1,2,1,4,1,1,3,1,4,1,1,1],'b':[5,2,8,3,10,3,5,15,45,41,23,9]}) 

    a   b
0   1   5
1   2   2
2   1   8
3   4   3
4   1   10
5   1   3
6   3   5
7   1   15
8   4   45
9   1   41
10  1   23
11  1   9

我想根据 Column 'a' 的值超过给定阈值将 DataFrame 划分为组。在这种情况下,阈值是 3,所以每当“a”列超过 3 的值时,我都想要一个新组。

我希望我的小组看起来像这样

    a   b
0   1   5
1   2   2
2   1   8


    a   b
0   4   3
1   1   10
2   1   3
3   3   5
4   1   15

    a   b
0   4   45
1   1   41
2   1   23
3   1   9

我唯一能想到的就是应用 cummax

data['max']=data.b.cummax()

但他的意志只适用于大于 3 的值总是变大的有限情况。

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    您可以使用(data.a > 3).cumsum;这将创建您需要的所需组变量:

    threshold = 3
    for k, g in data.groupby((data.a > threshold).cumsum()):
        print(g, "\n")
    
    #   a  b
    #0  1  5
    #1  2  2
    #2  1  8 
    
    #   a   b
    #3  4   3
    #4  1  10
    #5  1   3
    #6  3   5
    #7  1  15 
    
    #    a   b
    #8   4  45
    #9   1  41
    #10  1  23
    #11  1   9 
    

    【讨论】:

      【解决方案2】:

      您可以根据a 的值创建一个MultiIndex 并将其应用于数据框。这将允许您稍后对数据执行切片操作。

      可能有更快的方法可以做到这一点,但是您可以创建一个布尔序列,每次a 大于阈值(在本例中为 3),使用cumsum 为每个组创建一个索引,计算每个组中的出现次数,并使用该计数为索引创建一个额外的级别。

      new_index = ((data.a>3).cumsum().value_counts(sort=False)
                             .apply(range).apply(pd.Series).stack().index)
      data2 = data.set_index(new_index)
      data2
      
      # returns:
           a   b
      0 0  1   5
        1  2   2
        2  1   8
      1 0  4   3
        1  1  10
        2  1   3
        3  3   5
        4  1  15
      2 0  4  45
        1  1  41
        2  1  23
        3  1   9
      

      这允许您通过调用第一个索引来访问每个所需的组。

      data2.loc[0]
      
      # returns:
         a  b
      0  1  5
      1  2  2
      2  1  8
      

      【讨论】:

        【解决方案3】:

        例子:

        我:

        a = np.array([[1,2,3], [4,5,6]])
        print(a)
        

        O:

        array([[1, 2, 3],
           [4, 5, 6]])
        

        我:

        np.cumsum(a)
        

        O:

        array([ 1,  3,  6, 10, 15, 21])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-26
          • 2019-01-03
          • 1970-01-01
          • 2017-10-19
          • 1970-01-01
          相关资源
          最近更新 更多