Esta é uma extensão desta resposta aceita .
Meu DataFrame:
import pandas as pd
df = pd.DataFrame(
{
'a': [-3, -1, -2, -5, 10, -3, -13, -3, -2, 1, 2, -100],
'b': [1, 2, 3, 4, 5, 10, 80, 90, 100, 99, 1, 12]
}
)
Resultado esperado:
a b
5 -3 10
6 -13 80
7 -3 90
8 -2 100
Lógica:
a) Selecionando a sequência mais longa de negativos em a
.
b) Se por exemplo houver duas listras com o mesmo tamanho, quero aquela que tenha uma soma maior de b
. Tem df
duas listras de tamanho 4 mas quero a segunda porque a soma b
é maior.
Minha tentativa:
import numpy as np
s = np.sign(df['a'])
df['g'] = s.ne(s.shift()).cumsum()
df['size'] = df.groupby('g')['g'].transform('size')
df['b_sum'] = df.groupby('g')['b'].transform('sum')
Código
fora:
Você pode manter a mesma lógica, basta adicionar uma etapa extra de filtragem (por exemplo, com
query
) para obter todos os tamanhos máximos, antes de obter aidxmax
soma de "b":Saída:
Intermediário:
Ou, usando sua abordagem (observe que isso não garantiria um grupo único se dois ou mais tivessem o comprimento máximo e a mesma soma de b):