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
bySeries
:
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