2017-02-03 37 views
0

我有一个数据框,我试图创建一个返回1或0的新列。逻辑是如果状态的['Avg_Temp']大于或等于['Avg_Temp']。mean()然后我想['Hot']列的值为'1',否则它应该有'0'的值。大熊猫返回1或0时,与另一列的平均值相比

我尝试低于但我对DF结果[“热”]都是“1”,所以我知道我做错了什么......在您的帮助

谢谢!

数据=

Avg_Temp 
MI 66   
AL 78 
OH 50 
VT 64 
NB 34 

df = data 
TempMean = df10['Avg_Temp'].mean() 
df10['Hot'] = 0 
df10['Hot'] = df10.loc[df10['Avg_Temp'] >= TempMean] = 1 
return df10['Hot'] 
+1

有几个问题与您的代码,例如压痕。编辑问题,这样就很清楚了。就目前而言,'df'和'df10'是什么混淆。从未定义过'df10'。 – Mikk

+0

这可能就足够了:'df10 ['Hot'] [df10 ['Avg_Temp']> = TempMean] = 1'。注意在倒数第二行中你基本上有两项任务。 – Evert

+0

@Evert:通常应该避免像这样的链式赋值。 – DSM

回答

1

的错误是在这条线:

df10['Hot'] = df10.loc[df10['Avg_Temp'] >= TempMean] = 1 

什么df10.loc[df10['Avg_Temp'] >= TempMean] = 1手段是: “设定1到匹配的条件的行”。然后,将此操作的结果分配给Hot列。什么,你想要做的是,以取代符合:

df10.loc[df10['Avg_Temp'] >= TempMean, 'Hot'] = 1 
+0

我用了更短,更简单的两个,它解决了我的问题。谢谢! – SDS

2

df10['Hot'] = df10.loc[df10['Avg_Temp'] >= TempMean] = 1

不会做你打算什么。它在这里是相当于

df10.loc[df10['Avg_Temp'] >= TempMean] = 1 
df10['Hot'] = 1 

其中第一组中的每一行与Avg_Temp列> = TempMean为1,然后将热列1

你可能想

In [51]: df10["Hot"] = 0 

In [52]: df10.loc[df10["Avg_Temp"] >= TempMean, "Hot"] = 1 

In [53]: df10 
Out[53]: 
    Avg_Temp Hot 
MI  66 1 
AL  78 1 
OH  50 0 
VT  64 1 
NB  34 0 

或,更简单,

df10["Hot"] = (df10["Avg_Temp"] >= TempMean).astype(int) 

我们不需要先设置df10["Hot"]

0

尝试

df['Hot'] = np.where((df['Avg_Temp'] > df['Avg_Temp'].mean()), 1, 0) 
1

我喜欢

avg = df.Avg_Temp 
df.assign(Hot=avg.ge(avg.mean()).astype(np.uint8)) 
+0

不错的解决方案+1。 – ade1e