J'essaie d'ajouter une nouvelle colonne "energy_class" à un cadre de données "df_energy" contenant la chaîne "high" si la "consommation_energy" est supérieure à 400, "medium" si la "consommation_energy" est comprise entre 200 et 400 et low "si la valeur" consommation_énergie "est inférieure à 200 . J'essaie d'utiliser np.where de numpy, mais je vois que numpy.where(condition[, x, y])
ne traite que deux conditions, et non 3, comme dans mon cas.
Une idée pour m'aider s'il vous plait?
Merci d'avance
Vous pouvez utiliser un ternaire :
np.where(consumption_energy > 400, 'high',
(np.where(consumption_energy < 200, 'low', 'medium')))
Je voudrais utiliser la méthode cut () ici, qui générera très efficace et économie de mémoire category
dtype:
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]
Essayez ceci: Utilisation de la configuration 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
J'aime garder le code propre. C'est pourquoi je préfère np.vectorize
pour de telles tâches.
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"])
Ensuite, ajoutez simplement un tableau numpy en tant que colonne dans votre cadre de données en utilisant:
df_energy["energy_class"] = energy_class
L’avantage de cette approche est que, si vous souhaitez ajouter des contraintes plus complexes à une colonne, vous pouvez le faire facilement.
Je seconde en utilisant np.vectorize. C'est beaucoup plus rapide que np.where et aussi plus propre en termes de code. Vous pouvez certainement dire la vitesse avec de plus grands ensembles de données. Vous pouvez utiliser un format de dictionnaire pour vos conditions ainsi que la sortie de ces conditions.
# 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()