Мой подход заключается в том, чтобы сначала присвоить каждой группе «один и тот же знак в строке» другое число, чтобы перейти к groupby
.
Сравнение значения со смещенным массивом в отношении знака дает разделители этихгрупп.Кумулятивное суммирование затем приводит к уникальным числам, идентификаторам, если вы хотите:
df['grpnum'] = (np.sign(df.Value) != np.sign(df.Value.shift())).cumsum()
Затем вы можете сгруппировать по этому идентификатору и рассчитать длину групп, сумму и их знак:
ranking = df.groupby('grpnum').agg([sum, len, lambda x: sum(x)>0]).Value
, что приводитдо
sum len <lambda>
grpnum
1 2.0 1.0 True
2 -10.5 1.0 False
3 26.0 3.0 True
4 -30.0 2.0 False
print(ranking.groupby('<lambda>')['sum', 'len'].apply(lambda g: g[g['len']==g['len'].max()]))
sum len
<lambda> grpnum
True 3 26.0 3.0
False 4 -30.0 2.0