Numpy “donde” con múltiples condiciones

Intento agregar una nueva columna “energy_class” a un dataframe “df_energy”, que contiene la cadena “alta” si el valor “consumer_energy”> 400, “mediano” si el valor “consumption_energy” está entre 200 y 400, y ” bajo “si el valor de” consumer_energy “está por debajo de 200. Intento usar np.where desde numpy, pero veo que numpy.where(condition[, x, y]) trata solo dos condiciones, no 3 como en mi caso.

¿Alguna idea para ayudarme por favor?

Gracias de antemano

Puedes usar un ternario :

 np.where(consumption_energy > 400, 'high', (np.where(consumption_energy < 200, 'low', 'medium'))) 

Yo usaría el método cut () aquí, que generará un tipo de categoría muy eficiente y que ahorra memoria:

 In [124]: df Out[124]: consumption_energy 0 459 1 416 2 186 3 250 4 411 5 210 6 343 7 328 8 208 9 223 In [125]: pd.cut(df.consumption_energy, [0, 200, 400, np.inf], labels=['low','medium','high']) Out[125]: 0 high 1 high 2 low 3 medium 4 high 5 medium 6 medium 7 medium 8 medium 9 medium Name: consumption_energy, dtype: category Categories (3, object): [low < medium < high] 

Prueba esto: usando la configuración de @Maxu

 col = 'consumption_energy' conditions = [ df2[col] >= 400, (df2[col] < 400) & (df2[col]> 200), df2[col] <= 200 ] choices = [ "high", 'medium', 'low' ] df2["energy_class"] = np.select(conditions, choices, default=np.nan) consumption_energy energy_class 0 459 high 1 416 high 2 186 low 3 250 medium 4 411 high 5 210 medium 6 343 medium 7 328 medium 8 208 medium 9 223 medium 

Me gusta mantener el código limpio. Es por eso que prefiero np.vectorize para tales tareas.

 def conditions(x): if x > 400: return "High" elif x > 200: return "Medium" else: return "Low" func = np.vectorize(conditions) energy_class = func(df_energy["consumption_energy"]) 

Luego simplemente agregue una matriz numpy como una columna en su dataframe usando:

 df_energy["energy_class"] = energy_class 

La ventaja de este enfoque es que si desea agregar restricciones más complicadas a una columna, puede hacerlo fácilmente. Espero eso ayude.

Yo segundo utilizando np.vectorize. Es mucho más rápido que np.where y también un código más limpio. Definitivamente se puede decir la velocidad con conjuntos de datos más grandes. Puede usar un formato de diccionario para sus condicionales, así como la salida de esas condiciones.

 # Vectorizing with numpy row_dic = {'Condition1':'high', 'Condition2':'medium', 'Condition3':'low', 'Condition4':'lowest'} def Conditions(dfSeries_element,dictionary): ''' dfSeries_element is an element from df_series dictionary: is the dictionary of your conditions with their outcome ''' if dfSeries_element in dictionary.keys(): return dictionary[dfSeries] def VectorizeConditions(): func = np.vectorize(Conditions) result_vector = func(df['Series'],row_dic) df['new_Series'] = result_vector # running the below function will apply multi conditional formatting to your df VectorizeConditions()