DataFrame groupby的值序列不超过阈值

时间:2017-04-29 11:13:50

标签: python pandas group-by

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

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的值总是越来越大。

3 个答案:

答案 0 :(得分:2)

您可以使用(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 

答案 1 :(得分:0)

您可以根据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

答案 2 :(得分:0)

示例:

I:

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

○:

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

I:

np.cumsum(a)

○:

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