es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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 valores True 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:

    last_true_A = df.A.cumsum().where(df.A).shift(fill_value=-1)
    last_true_B = df.B.cumsum().where(df.B).shift(fill_value=-1)
    
    df['C'] = (df.A & (last_true_B < last_true_A)) | (~df.A & (last_true_B == last_true_A))
    

    El método cumsum() se utiliza para crear una nueva columna que asigna un índice único a cada bloque contiguo de valores True en la columna A y B, respectivamente. El método where() se utiliza para establecer todos los valores que no son True en estas columnas en NaN, dejando solo el índice del último valor True 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 valor True antes de la fila actual. El parámetro fill_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 valor True, y si es así, si el último valor True en la columna B se produjo antes del último valor True en la columna A. Usamos el operador ~ para verificar si la columna A tiene un valor False, y si es así, si los últimos valores True 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.

Comments are closed.