En pandas df encontrar si el valor True en la columna A es su primera aparición desde el último True en la columna B.
Estoy buscando la manera más eficiente de encontrar si el valor True
en la columna A
es la primera aparición desde el último valor True
en la columna B
.
En estos ejemplos, la salida esperada sería la columna C
.
Ejemplo 1:
python
df = pd.DataFrame({
'A': [False, False, True, False, True, False, True, False, True],
'B': [True, False, False, False, False, True, False, False, False],
'C': [False, False, True, False, False, False, True, False, False]
})
A | B | C | |
---|---|---|---|
0 | False | True | False |
1 | False | False | False |
2 | True | False | True |
3 | False | False | False |
4 | True | False | False |
5 | False | True | False |
6 | True | False | True |
7 | False | False | False |
8 | True | False | False |
Ejemplo 2:
python
df = pd.DataFrame({
'A': [True, False, False, True, False, True, False, True, False],
'B': [False, True, False, False, False, False, True, False, False],
'C': [False, False, False, True, False, False, False, True, False]
})
A | B | C | |
---|---|---|---|
0 | True | False | False |
1 | False | True | False |
2 | False | False | False |
3 | True | False | True |
4 | False | False | False |
5 | True | False | False |
6 | False | True | False |
7 | True | False | True |
8 | False | False | False |
Ejemplo 3:
Aquí puede encontrar un archivo .csv con un ejemplo más grande.
davy.ai
Una posible solución a este problema es usar el método
shift()
de Pandas DataFrame para crear nuevas columnas que rastreen los índices de los últimos valoresTrue
en las columnas A y B, respectivamente. Luego, podemos usar indexación booleana y operaciones lógicas para crear la columna final C de la siguiente manera:El método
cumsum()
se utiliza para crear una nueva columna que asigna un índice único a cada bloque contiguo de valoresTrue
en la columna A y B, respectivamente. El métodowhere()
se utiliza para establecer todos los valores que no sonTrue
en estas columnas enNaN
, dejando solo el índice del último valorTrue
en cada bloque.Luego, se utiliza el método
shift()
para desplazar los valores en estas columnas hacia abajo en uno, de modo que representen el índice del último valorTrue
antes de la fila actual. El parámetrofill_value
asegura que el primer valor en cada secuencia se establezca en -1, para que se considere más pequeño que cualquier otro índice.La columna final C se crea combinando la indexación booleana y las operaciones lógicas. Usamos el operador
&
para verificar si la columna A tiene un valorTrue
, y si es así, si el último valorTrue
en la columna B se produjo antes del último valorTrue
en la columna A. Usamos el operador~
para verificar si la columna A tiene un valorFalse
, y si es así, si los últimos valoresTrue
en las columnas A y B son iguales.Esta solución debería ser eficiente para conjuntos de datos grandes, ya que solo requiere algunas operaciones simples en los datos utilizando funciones vectorizadas.