То, что вы пытаетесь вычислить, требует, чтобы вы сгруппировали
- последовательные строки
- с общим свойством значений их столбцов.
Обратите внимание, что группировка последовательных строк - это группировка данных на основе свойства индекса . Распространенный и очень гибкий трюк, который вы можете использовать в подобных случаях, - это ввести новый столбец , в котором хранится свойство индекса, который вам нужен.
В этом случае вы можете отслеживать в столбец, сколько раз значение в столбце Code
изменялось между последовательными строками:
(x.assign(code_changed=lambda df: df.Code != df.Code.shift(),
ordered_code=lambda df: df.code_changed.cumsum())
Code Value code_changed ordered_code
0 a 0 True 1
1 a 1 False 1
2 a 2 False 1
3 b 3 True 2
4 b 4 False 2
5 a 5 True 3
6 a 6 False 3
7 a 7 False 3
8 b 8 True 4
9 b 9 False 4
10 b 10 False 4
11 a 11 True 5
12 a 12 False 5
Столбец ordered_code
содержит точную информацию о группировке, которую вы ищете. Затем вы можете получить результат, на который надеетесь, ограничившись строками с Code
равным 'b'
и суммируя Value
s:
(x.assign(code_changed=lambda df: df.Code != df.Code.shift(),
ordered_code=lambda df: df.code_changed.cumsum())
.pipe(lambda df: df[df.Code == 'b'])
.groupby('ordered_code')
.Value
.agg(lambda values: values.iloc[0] / values.iloc[-1])
.prod())
Это дает
0.6000000000000001
по желанию.