Python 如何根据停止条件对已排序的数据帧进行分组?

Python 如何根据停止条件对已排序的数据帧进行分组?,python,pandas,Python,Pandas,假设我有熊猫数据框,下面的数据框已经在列A上排序 import pandas as pd data = {'A': range(15), 'B': range(5)*3} df = pd.DataFrame(data) # just in case: df.sort('A', inplace=True) 生成的数据帧如下所示: A | B ----- 0 | 0 1 | 1 2 | 2 3 | 3 4 | 4 5 | 0 6 | 1 7 | 2 8 | 3

假设我有熊猫数据框,下面的数据框已经在列
A
上排序

import pandas as pd
data = {'A': range(15),
        'B': range(5)*3}
df = pd.DataFrame(data)
# just in case:
df.sort('A', inplace=True)
生成的数据帧如下所示:

A  | B
-----
0  | 0
1  | 1
2  | 2
3  | 3
4  | 4
5  | 0
6  | 1
7  | 2
8  | 3
9  | 4
10 | 0
11 | 1
12 | 2
13 | 3
14 | 4
我想根据列
B
中的“停止点”将其分为三组,其中该列的值从4降到0。简单地使用groupby无法适应这种情况,因为没有区分组的键


通过按排序顺序迭代各个行可以很简单地做到这一点,但我想知道是否有pandas本机解决方案。

IIUC您可以为groupby创建新列
C

或者更好的
groupby
by
Series

print (df[['A','B']].groupby([((df.B == 0).cumsum())]).sum())
    A   B
B        
1  10  10
2  35  10
3  60  10
对于存储组,可以使用
dict
理解:

for i, g in df[['A','B']].groupby([((df.B == 0).cumsum())]):
    print (i)
    print (g)    

1
   A  B
0  0  0
1  1  1
2  2  2
3  3  3
4  4  4
2
   A  B
5  5  0
6  6  1
7  7  2
8  8  3
9  9  4
3
     A  B
10  10  0
11  11  1
12  12  2
13  13  3
14  14  4

dfs = {i-1: g for i,g in df[['A','B']].groupby([((df.B == 0).cumsum())])}
print (dfs[0])
   A  B
0  0  0
1  1  1
2  2  2
3  3  3
4  4  4

也许这会有所帮助:你答案的第一部分正是我所需要的。
for i, g in df[['A','B']].groupby([((df.B == 0).cumsum())]):
    print (i)
    print (g)    

1
   A  B
0  0  0
1  1  1
2  2  2
3  3  3
4  4  4
2
   A  B
5  5  0
6  6  1
7  7  2
8  8  3
9  9  4
3
     A  B
10  10  0
11  11  1
12  12  2
13  13  3
14  14  4

dfs = {i-1: g for i,g in df[['A','B']].groupby([((df.B == 0).cumsum())])}
print (dfs[0])
   A  B
0  0  0
1  1  1
2  2  2
3  3  3
4  4  4