Este é meu DataFrame:
import pandas as pd
df = pd.DataFrame({
'a': [10, 20, 30, 1, 20, 3, 4, 0],
'b': [30, 3, 11, 25, 24, 31, 29, 2],
'c': [True, True, True, False, False, True, True, True]
})
A saída esperada é criar a coluna d
:
a b c d
0 10 30 True NaN
1 20 3 True 10
2 30 11 True 20
3 1 25 False NaN
4 20 24 False NaN
5 3 31 True NaN
6 4 29 True 30
7 0 2 True 4
Primeiro de tudo, os valores em b
que c
estão True
são selecionados. Explico o processo a partir da linha 1
porque é mais fácil de entender.
O valor em b
é 3, então todos os valores acima dele devem ser verificados. E o valor MAIS PRÓXIMO em a
que for maior que 3 deve ser selecionado. Então 10 é selecionado.
para a linha número 2
, o valor é 11. O valor mais próximo deste que é maior que ele a
é 20.
Para as linhas 3 e 4, c
is False
. NaN
deve ser selecionado.
Para a linha 5
, como não há valores anteriores maiores que 31 em a
, , NaN
é selecionado.
Para a linha 6
, o valor mais próximo que a
for maior que 29 é 30.
Foi isso que tentei até agora. Não me dá a saída. Acho que a abordagem que estou tomando pode estar correta.
t = df['a'].to_numpy()
h = df['b'].to_numpy()
m2 = t < h[:, None]
df['d'] = np.nanmax(np.where(m2, t, np.nan), axis=1)
Para encontrar o valor anterior mais próximo na coluna 'a' que seja maior que o valor atual na coluna 'b' (somente onde 'c' é Verdadeiro), você pode usar uma abordagem vetorizada ou uma solução de loop simples.
Isso me dá esta saída:
Uma abordagem eficiente seria usar
janitor
'sconditional_join
:Saída: