Pandas múltiples condiciones basadas en múltiples columnas usando np.where

Estoy tratando de colorear los puntos de un dataframe de pandas dependiendo de DOS condiciones. Ejemplo:

Si el valor de col1> a (float) Y el valor de col2- de col3 <b (float), entonces el valor de col 4 = string, else: other string.

He intentado de muchas maneras diferentes ahora y todo lo que encontré en línea dependía solo de una condición.

El código de mi ejemplo siempre genera el error: el valor de verdad de una serie es ambiguo. Utilice a.empty, a.bool (), a.item (), a.any () o a.all ().

Aquí está el código. Intenté varias variaciones sin éxito.

df = pd.DataFrame() df['A'] = range(10) df['B'] = range(11,21,1) df['C'] = range(20,10,-1) borderE = 3. ex = 0. #print df df['color'] = np.where(all([df.A < borderE, df.B - df.C < ex]), 'r', 'b') 

Por cierto: entiendo, lo que dice pero no cómo manejarlo … ¡Gracias de antemano!

Los criterios de selección utilizan la indexación booleana :

 df['color'] = np.where(((df.A < borderE) & ((df.B - df.C) < ex)), 'r', 'b') >>> df ABC color 0 0 11 20 r 1 1 12 19 r 2 2 13 18 r 3 3 14 17 b 4 4 15 16 b 5 5 16 15 b 6 6 17 14 b 7 7 18 13 b 8 8 19 12 b 9 9 20 11 b 

Envuelve el IF en una función y aplícalo:

 def color(row): borderE = 3. ex = 0. if (row.A > borderE) and( row.B - row.C < ex) : return "somestring" else: return "otherstring" df.loc[:, 'color'] = df.apply(color, axis = 1) 

Rendimientos:

  ABC color 0 0 11 20 otherstring 1 1 12 19 otherstring 2 2 13 18 otherstring 3 3 14 17 otherstring 4 4 15 16 somestring 5 5 16 15 otherstring 6 6 17 14 otherstring 7 7 18 13 otherstring 8 8 19 12 otherstring 9 9 20 11 otherstring