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.

¿Cómo cambiar el valor de arriba hacia abajo condicionalmente en columnas de un dataframe de Python Pandas?

¿Cómo puedo copiar el valor anterior de arriba a abajo condicionalmente en columnas en un dataframe de Python Pandas?
¿Cómo puedo resolverlo por vectorización con Pandas?
Creé las columnas B y C operando en un dataframe.
Quiero cambiar las columnas en el dataframe de arriba a abajo.

Tengo esto

list_one = [1.10, 1.20, 1.25, 1.30, 0.50, 0.60, 1.70, 1.80, 2.00]

df = pd.DataFrame({'A': list_one})
df['B'] = df['A'] + df['A'] * 0.1
df['C'] = df['A'] - df['A'] * 0.1
print(df)

output>>>
    A       B       C
0   1.100   1.210   0.990
1   1.200   1.320   1.080
2   1.250   1.375   1.125
3   1.300   1.430   1.170
4   0.500   0.550   0.450
5   0.600   0.660   0.540
6   1.700   1.870   1.530
7   1.800   1.980   1.620
8   2.000   2.200   1.800

Para ser más descriptivo, necesito estas condiciones y dataframe.

if A < B y A > C :
    B = B.shift()
    C = C.shift()
    D = 0
elif A > B:
    D = 1
elif A < B:
    D = -1

¿Cómo puedo obtener este resultado?

    A        B       C      D
0   1.100   1.210   0.990   0
1   1.200   1.210   0.990   0
2   1.250   1.375   1.125   1
3   1.300   1.375   1.125   0
4   0.500   0.550   0.450   -1
5   0.600   0.660   0.540   1
6   1.700   1.870   1.530   1
7   1.800   1.870   1.530   0
8   2.000   2.200   1.800   1

Mi código defectuoso no está dando el resultado anterior.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema utilizando la vectorización con Pandas, podemos definir las condiciones utilizando máscaras booleanas y aplicarlas directamente a las columnas utilizando indexación booleana.

    # Define las condiciones como máscaras booleanas
    bigger_c = df['A'] > df['C'].shift()
    smaller_b = df['A'] < df['B'].shift()
    bigger_b = df['A'] > df['B'].shift()
    smaller_c = df['A'] < df['C'].shift()
    
    # Aplica las condiciones a las columnas utilizando indexación booleana
    df.loc[smaller_b & bigger_c, ['B', 'C']] = df[['B', 'C']].shift()
    df.loc[bigger_b, 'D'] = 1
    df.loc[smaller_c, 'D'] = -1
    

    Esto nos dará la salida esperada:

         A      B      C  D
    0  1.10  1.210  0.990  0
    1  1.20  1.210  0.990  0
    2  1.25  1.375  1.125  1
    3  1.30  1.375  1.125  0
    4  0.50  0.550  0.450 -1
    5  0.60  0.660  0.540  1
    6  1.70  1.870  1.530  1
    7  1.80  1.870  1.530  0
    8  2.00  2.200  1.800  1
    

Comments are closed.