Pandas / Python: establecer el valor de una columna basado en el valor en otra columna

Necesito establecer el valor de una columna en función del valor de otra en un dataframe de Pandas. Esta es la lógica:

if df['c1'] == 'Value': df['c2'] = 10 else: df['c2'] = df['c3'] 

No puedo hacer esto para hacer lo que quiero, que es simplemente crear una columna con nuevos valores (o cambiar el valor de una columna existente: cualquiera de los dos funciona para mí).

Si bash 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 hacer esto sería usar la indexación con .loc .

Ejemplo

En la ausencia de un dataframe de ejemplo, haré 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 cuando c1 es Value , en cuyo caso, le gustaría asignarlo a 10:

Primero, puede crear una nueva columna c2 y establecerla como 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 en los que c1 sea ​​igual a 'Value' usando .loc , y asigne el valor deseado en c2 en esos índices:

 df.loc[df['c1'] == 'Value', 'c2'] = 10 

Y terminas con esto:

 >>> df c1 c2 0 aa 1 bb 2 cc 3 dd 4 ee 5 Value 10 6 gg 

Si, como sugirió en su pregunta, tal vez a veces solo quiera reemplazar los valores en la columna que ya tiene , en lugar de crear una nueva columna, luego omita la creación de la columna y haga lo siguiente:

 df['c1'].loc[df['c1'] == 'Value'] = 10 

Dandote:

 >>> df c1 0 a 1 b 2 c 3 d 4 e 5 10 6 g 

tratar:

df['c2'] = df['c1'].apply(lambda x: 10 if x == 'Value' else x)

puede usar np.where() para establecer valores basados ​​en una encoding

 #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 c3 c4 0 4 1 1 1 8 9 X 2 1 8 8 3 3 5 5 4 3 8 8 

Sugiero hacerlo en dos pasos:

 # set fixed value to 'c2' where the condition is met df.loc[df['c1'] == 'Value', 'c2'] = 10 # copy value from 'c3' to 'c2' where the condition is NOT met df.loc[df['c1'] != 'Value', 'c2'] = df[df['c1'] != 'Value', 'c3']