¿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 🙂
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 deValue
. Esto resulta en una lista que tiene más valores de los que esperas.Para solucionar esto, puedes usar el método
iterrows()
oapply()
para iterar sobre cada fila en lugar de usar un bucle sobre las columnas. Aquí tienes un ejemplo utilizando el métodoapply()
:Resultado:
Esto crea una nueva columna llamada
New Value
con la lógica deseada aplicada para cada fila.