2016-08-23 78 views
7

我嘗試添加新的列「ENERGY_CLASS」發送數據幀「df_energy」它包含字符串「高」如果「consumption_energy」值> 400,「中」如果「consumption_energy 「價值是200和400之間,以及‘低’,如果‘consumption_energy’值低於200 我嘗試從numpy的np.where使用,但我看到numpy.where(condition[, x, y])在我的情況下治療只有兩個條件不一樣3。numpy的「其中」與多個條件

任何想法,以幫助我嗎?

預先感謝您

回答

9

您可以使用ternary

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

我會在這裏使用的cut()方法,這將產生非常高效和節省內存的category D型:

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] 
4

試試這個: 使用@Maxu的設置

conditions = [ df2['consumption_energy'] >= 400, (df2['consumption_energy'] < 400) & (df2['consumption_energy']> 200), df2['consumption_energy'] <= 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 
2

我喜歡保持代碼的清潔。這就是爲什麼我喜歡np.vectorize這樣的任務。

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

然後,只需使用添加numpy的陣列在數據幀的列:

df_energy["energy_class"] = energy_class 

這種方法的好處是,如果你想更復雜的約束添加到列,這是可以做到容易。 希望它有幫助。