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 multiplicar dos columnas juntas con una condición aplicada a una de las columnas en pandas python?

Aquí hay algunos datos de ejemplo:

data = {'Company': ['A', 'B', 'C', 'D', 'E', 'F'],
        'Value': [18700, 26000, 44500, 32250, 15200, 36000],
        'Change': [0.012, -0.025, -0.055, 0.06, 0.035, -0.034]
       }
df = pd.DataFrame(data, columns = ['Company', 'Value', 'Change'])
df
Empresa Valor Cambio
A 18700 0.012
B 26000 -0.025
C 44500 -0.055
D 32250 0.060
E 15200 0.035
F 36000 -0.034

Me gustaría crear una nueva columna llamada ‘Nuevo Valor’. La lógica para esta columna es algo como lo siguiente para cada fila:

  • si Cambio > 0, entonces Valor + (Valor * Cambio)
  • si Cambio < 0, entonces Valor – (Valor * (abs(Cambio)))

Intenté crear una lista con el siguiente bucle y agregarla a df como una nueva columna, pero se devolvieron muchos más valores de los esperados, cuando esperaba solo 5 (correspondiendo con el número de filas en df).

lst = []

for x in df['Cambio']:
    for y in df['Valor']:
        if x > 0:
            lst.append(y + (y*x))
        elif x < 0:
            lst.append(y - (y*(abs(x))))
print(lst)

Sería genial si alguien pudiera señalar dónde me equivoqué o sugerir un método alternativo 🙂

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con tu código es que estás usando bucles anidados, por lo que para cada valor de Change, estás iterando sobre todos los valores de Value. Esto resulta en una lista que tiene más valores de los que esperas.

    Para solucionar esto, puedes usar el método iterrows() o apply() para iterar sobre cada fila en lugar de usar un bucle sobre las columnas. Aquí tienes un ejemplo utilizando el método apply():

    import pandas as pd
    
    data = {'Company': ['A', 'B', 'C', 'D', 'E', 'F'],
            'Value': [18700, 26000, 44500, 32250, 15200, 36000],
            'Change': [0.012, -0.025, -0.055, 0.06, 0.035, -0.034]
           }
    df = pd.DataFrame(data, columns = ['Company', 'Value', 'Change'])
    
    def new_value(row):
        if row['Change'] > 0:
            return row['Value'] + (row['Value'] * row['Change'])
        elif row['Change'] < 0:
            return row['Value'] - (row['Value'] * abs(row['Change']))
        else:
            return row['Value']
    
    df['New Value'] = df.apply(new_value, axis=1)
    print(df)
    

    Resultado:

      Company  Value  Change     New Value
    0       A  18700   0.012  18928.400000
    1       B  26000  -0.025  25270.000000
    2       C  44500  -0.055  42025.000000
    3       D  32250   0.060  34155.000000
    4       E  15200   0.035  15732.000000
    5       F  36000  -0.034  34824.000000
    

    Esto crea una nueva columna llamada New Value con la lógica deseada aplicada para cada fila.

Comments are closed.