it-swarm.com.de

Numpy "wo" mit mehreren Bedingungen

Ich versuche, einem Datenrahmen "df_energy" eine neue Spalte "energy_class" hinzuzufügen, die den String "high" enthält, wenn der Wert "usage_energy"> 400 ist, "medium", wenn der Wert "usage_energy" zwischen 200 und 400 liegt. low "wenn der Wert für" verbrauchs_energie "unter 200 liegt. Ich versuche, np.where von numpy zu verwenden, aber ich sehe, dass numpy.where(condition[, x, y]) nur zwei Bedingungen behandelt, nicht 3 wie in meinem Fall.

Irgendeine Idee, mir zu helfen, bitte?

Danke im Voraus

13
Poisson

Sie können ein ternary verwenden:

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

Ich würde hier die cut () - Methode verwenden, die sehr effizient und speichersparend category dtype generiert:

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

Versuchen Sie folgendes: Verwenden Sie das Setup von @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

Ich mag es, den Code sauber zu halten. Deshalb bevorzuge ich np.vectorize für solche Aufgaben.

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"])

Fügen Sie dann einfach numpy array als Spalte in Ihrem Datenrahmen hinzu.

df_energy["energy_class"] = energy_class

Der Vorteil dieses Ansatzes besteht darin, dass das Hinzufügen von komplizierteren Einschränkungen zu einer Spalte problemlos durchgeführt werden kann. Hoffe, es hilft.

7
user4340135

Ich verwende np.vectorize. Es ist viel schneller als np.where und auch sauberer Code. Sie können die Geschwindigkeit mit größeren Datensätzen definitiv erkennen. Sie können ein Wörterbuchformat für Ihre Bedingungen sowie für die Ausgabe dieser Bedingungen verwenden. 

# 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

WARNING : Seien Sie immer vorsichtig, wenn Ihre Daten fehlende Werte haben np.where ist möglicherweise schwierig zu verwenden und kann versehentlich zu falschen Ergebnissen führen.

Betrachten Sie diese Situation:

df['cons_ener_cat'] = np.where(df.consumption_energy > 400, 'high', 
         (np.where(df.consumption_energy < 200, 'low', 'medium')))

# if we do not use this second line, then
#  if consumption energy is missing it would be shown medium, which is WRONG.
df.loc[df.consumption_energy.isnull(), 'cons_ener_cat'] = np.nan

Alternativ können Sie einen oder mehrere verschachtelte Werte np.where Für medium und nan verwenden, was hässlich wäre.

Meiner Meinung nach ist der beste Weg pd.cut. Es beschäftigt sich mit NaNs und ist einfach zu bedienen.

Beispiele:

import numpy as np
import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

# pd.cut
df['age_cat'] = pd.cut(df.age, [0, 20, 60, np.inf], labels=['child','medium','old'])


# manually add another line for nans
df['age_cat2'] = np.where(df.age > 60, 'old', (np.where(df.age <20, 'child', 'medium')))
df.loc[df.age.isnull(), 'age_cat'] = np.nan

# multiple nested where
df['age_cat3'] = np.where(df.age > 60, 'old',
                         (np.where(df.age <20, 'child',
                                   np.where(df.age.isnull(), np.nan, 'medium'))))

# outptus
print(df[['age','age_cat','age_cat2','age_cat3']].head(7))
    age age_cat age_cat2 age_cat3
0  22.0  medium   medium   medium
1  38.0  medium   medium   medium
2  26.0  medium   medium   medium
3  35.0  medium   medium   medium
4  35.0  medium   medium   medium
5   NaN     NaN   medium      nan
6  54.0  medium   medium   medium
0
Poudel