Este é o meu DataFrame.
import pandas as pd
df = pd.DataFrame(
{
'a': [100, 1123, 9999, 100, 1, 954, 1],
'b': [1000, 11123, 1123, 0, 55, 0, 1],
},
)
A saída esperada é a criação da coluna c
:
a b c
0 100 1000 NaN
1 1123 11123 NaN
2 9999 1123 9999.0
3 100 0 NaN
4 1 55 NaN
5 954 0 NaN
6 1 1 NaN
A máscara é:
mask = ((df.a > df.b))
Quero pegar a primeira linha que atenda às condições desta máscara SE APENAS estiver nas 3 primeiras linhas e colocar df.a
para criar c
. Para este exemplo este código funciona:
df.loc[mask.cumsum().eq(1) & mask, 'c'] = df.a
Mas para este DataFrame ele deve retornar NaN
porque c
a primeira instância de mask
não está nas 3 primeiras linhas. Mas não funciona.
df = pd.DataFrame(
{
'a': [0, 0, 0, 0, 0, 954, 1],
'b': [1000, 11123, 1123, 0, 55, 0, 1],
},
)
Você pode adicionar uma condição à máscara com base no índice:
Para o seu segundo exemplo, isso resultará em:
Se quiser que a coluna
c
saia exatamente como na sua pergunta, você pode usar o seguinte código:Quando
df.a[mask]
é transmitido na última linha, colocará NaNs em todas as linhas onde a máscara for avaliada como False. Então, isso resulta em:Não há necessidade de calcular outra máscara, apenas o corte
df['a']
e a reindexação ocorrerão durante a atribuição:Saída: