Este é o meu DataFrame:
import pandas as pd
df = pd.DataFrame(
{
'a': [100, 1123, 123, 100, 1, 0, 1],
'b': [1000, 11123, 1123, 0, 55, 0, 1],
},
index=range(100, 107)
)
E este é o resultado esperado. Quero criar uma coluna c
:
a b c
100 100 1000 NaN
101 1123 11123 NaN
102 123 1123 NaN
103 100 0 3.0
104 1 55 NaN
105 0 0 NaN
106 1 1 NaN
A máscara usada é:
mask = ((df.a > df.b))
Quero obter o índice da primeira linha que mask
ocorre. Quero preservar o índice original, mas obter o reset_index()
valor. Neste exemplo, a primeira instância da máscara está em index 3
.
Posso obter a primeira instância da máscara assim:
df.loc[mask.cumsum().eq(1) & mask, 'c'] = 'the first row'
Mas não sei como obter o índice.
Código
Este código pode ser modificado para pesquisar também o segundo e terceiro itens, não apenas o primeiro.
df:
Se você está procurando apenas o primeiro valor, o código a seguir pode ser mais simples:
Atualizar resposta
se você quiser apenas a localização do índice, use o seguinte código:
local:
df:
Filtre com sua condição e obtenha o primeiro resultado:
O código abaixo avalia cada linha do dataframe usando
.apply()
e, quando a condiçãoa > b
é atendida, retorna o índice linear da linha. Os resultados são gravados em uma nova coluna'c'
.Resultado:
Você pode realizar a indexação booleana no índice e dividir o primeiro item:
Nota. usando
[:1]
em vez de[1]
também funcionar se não houverTrue
.Saída:
Se não houvesse correspondência, isso criaria uma coluna vazia: