我有一个包含两列的数据框。
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的值总是越来越大。
答案 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])