Necesito establecer el valor de una columna en función del valor de otra en un marco de datos de Pandas. Esta es la lógica:
if df['c1'] == 'Value': df['c2'] = 10 else: df['c2'] = df['c3']No puedo hacer que esto haga lo que quiero, que es simplemente crear una columna con nuevos valores (o cambiar el valor de una columna existente: cualquiera funciona para mí).
Si trato de ejecutar el código anterior o si lo escribo como una función y uso el método de aplicación, obtengo lo siguiente:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().una forma de hacerlo sería utilizar la indexación con .loc .
Ejemplo
En ausencia de un marco de datos de ejemplo, inventaré uno aquí:
import numpy as np import pandas as pd df = pd.DataFrame({'c1': list('abcdefg')}) df.loc[5, 'c1'] = 'Value' >>> df c1 0 a 1 b 2 c 3 d 4 e 5 Value 6 g Suponiendo que desea crear una nueva columna c2 , equivalente a c1 excepto donde c1 es Value , en cuyo caso, le gustaría asignarlo a 10:
Primero, puede crear una nueva columna c2 y establecerla en equivalente a c1 usando una de las siguientes dos líneas (esencialmente hacen lo mismo):
df = df.assign(c2 = df['c1']) # OR: df['c2'] = df['c1'] Luego, encuentre todos los índices donde c1 es igual a 'Value' usando .loc y asigne el valor deseado en c2 a esos índices:
df.loc[df['c1'] == 'Value', 'c2'] = 10Y terminas con esto:
>>> df c1 c2 0 aa 1 bb 2 cc 3 dd 4 ee 5 Value 10 6 ggSi, como sugirió en su pregunta, a veces solo desea reemplazar los valores en la columna que ya tiene , en lugar de crear una nueva columna, simplemente omita la creación de la columna y haga lo siguiente:
df['c1'].loc[df['c1'] == 'Value'] = 10 # or: df.loc[df['c1'] == 'Value', 'c1'] = 10Dandote:
>>> df c1 0 a 1 b 2 c 3 d 4 e 5 10 6 gPuede usar np.where() para establecer valores en función de una condición específica:
#df c1 c2 c3 0 4 2 1 1 8 7 9 2 1 5 8 3 3 3 5 4 3 6 8 Ahora cambie los valores (o establezca) en la columna ['c2'] según su condición.
df['c2'] = np.where(df.c1 == 8,'X', df.c3) c1 c2 c3 0 4 1 1 1 8 X 9 2 1 8 8 3 3 5 5 4 3 8 8tratar:
df['c2'] = df['c1'].apply(lambda x: 10 if x == 'Value' else x)