我在您的示例数据中添加了一个组,以包括该组以不连续的True 开头,后跟False 的情况。
df.expanding.min() 与cummin 相同,但min_periods 控制在多少行之后开始累积。 bfill 在每个组的第一行中相应地填充 nan 值。
df['actual'] = (df.groupby(['A','B','C']).D
.apply(lambda x: x.expanding(min_periods=2)
.min()
.bfill()
.cumsum())
.astype('int'))
assert df.actual.equals(df.Desired), 'different results, try again'
df
输出
A B C D Desired actual
0 100 AAA 1 False 0 0
1 100 AAA 1 False 0 0
2 200 BBB 55 True 1 1
3 200 BBB 55 True 2 2
4 200 BBB 55 True 3 3
5 200 BBB 55 False 3 3
6 200 BBB 55 True 3 3
7 300 CCC 99 False 0 0
8 300 CCC 99 True 0 0
9 400 DDD 199 True 0 0
10 400 DDD 199 False 0 0
准备示例数据框
import pandas as pd
import io
t = '''
A,B,C,D,Desired
100,AAA,1,False,0
100,AAA,1,False,0
200,BBB,55,True,1
200,BBB,55,True,2
200,BBB,55,True,3
200,BBB,55,False,3
200,BBB,55,True,3
300,CCC,99,False,0
300,CCC,99,True,0
400,DDD,199,True,0
400,DDD,199,False,0
'''
df = pd.read_csv(io.StringIO(t))
df
输出
A B C D Desired
0 100 AAA 1 False 0
1 100 AAA 1 False 0
2 200 BBB 55 True 1
3 200 BBB 55 True 2
4 200 BBB 55 True 3
5 200 BBB 55 False 3
6 200 BBB 55 True 3
7 300 CCC 99 False 0
8 300 CCC 99 True 0
9 400 DDD 199 True 0
10 400 DDD 199 False 0
获取每个组的最大行数
df.groupby(['A','B','C']).actual.max().reset_index()
输出
A B C actual
0 100 AAA 1 0
1 200 BBB 55 3
2 300 CCC 99 0
3 400 DDD 199 0