web-dev-qa-db-fra.com

Numpy "where" avec plusieurs conditions

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

13
Poisson

Vous pouvez utiliser un ternaire :

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

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]
12
MaxU

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
9
Merlin

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.

7
user4340135

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()
0
wpmoradi