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
Sie können ein ternary verwenden:
np.where(consumption_energy > 400, 'high',
(np.where(consumption_energy < 200, 'low', 'medium')))
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]
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
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.
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()
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.
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