您可以使用掩码来标识重新启动,将它们相加,然后减go 第一个值:
df = pd.DataFrame({'value': [7,15,22,29,2,5,7,20,25,3,7]})
out = (df.loc[df['value'].diff(-1).fillna(1).gt(0), 'value'].sum()
-df['value'].iloc[0]
)
输出:54
same logic per group
df = pd.DataFrame({'group': list('aaaaaabbbbb'),
'value': [7,15,22,29,2,5,7,20,25,3,7]})
def total(g):
return (g[g.diff(-1).fillna(1).gt(0)].sum()
-g.iloc[0]
)
out = df.groupby('group')['value'].agg(total)
输出:
group
a 27
b 25
dtype: int64
分解:
group value
0 a 7 # -7
1 a 15
2 a 22
3 a 29 # +29
4 a 2
5 a 5 # +5 = 27
6 b 7 # -7
7 b 20
8 b 25 # +25
9 b 3
10 b 7 # +7 = 25
中间体:
group value diff(-1) fillna(1) gt(0) iloc[0]
0 a 7 -8.0 -8.0 False X
1 a 15 -7.0 -7.0 False
2 a 22 -7.0 -7.0 False
3 a 29 27.0 27.0 True
4 a 2 -3.0 -3.0 False
5 a 5 NaN 1.0 True
6 b 7 -13.0 -13.0 False X
7 b 20 -5.0 -5.0 False
8 b 25 22.0 22.0 True
9 b 3 -4.0 -4.0 False
10 b 7 NaN 1.0 True
NB. 100 can also be simplified to 101.