2017-04-10 185 views
1

我有一個數據框df與年齡,我正在努力將文件分爲0和1年齡組。python熊貓loc錯誤

DF:

User_ID | Age 
35435  22 
45345  36 
63456  18 
63523  55 

我嘗試以下

df['Age_GroupA'] = 0 
df['Age_GroupA'][(df['Age'] >= 1) & (df['Age'] <= 25)] = 1 

,但得到這個錯誤

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame 

爲了避免它,我打算去的.loc

df['Age_GroupA'] = 0 
df['Age_GroupA'] = df.loc[(df['Age'] >= 1) & (df['Age'] <= 25)] = 1 

然而,這標誌着所有年齡爲1

這是我得到

User_ID | Age | Age_GroupA 
35435  22  1 
45345  36  1 
63456  18  1 
63523  55  1 

,而這是我們的目標

User_ID | Age | Age_GroupA 
35435  22  1 
45345  36  0 
63456  18  1 
63523  55  0 

謝謝

+0

你想'df.loc [(DF [ 'Age_MDB_S']> = 1)&(DF [ 'Age_MDB_S'] <= 25), 'Age_GroupA'] = 1' – EdChum

+0

這個工作很大@EdChum ;你能否將它作爲答案發布,以便我可以接受它?謝謝 – jeangelj

+0

@EdChum:來吧,這不是問題或旁邊,所以它不應該是一個評論.. ;-) – DSM

回答

3

由於同伴壓力(@DSM),我覺得有必要擊穿你的錯誤:

df['Age_GroupA'][(df['Age'] >= 1) & (df['Age'] <= 25)] = 1 

這是chained indexing/assignment

所以你嘗試過什麼未來:

df['Age_GroupA'] = df.loc[(df['Age'] >= 1) & (df['Age'] <= 25)] = 1 

不正確的形式,當使用loc你想要:

df.loc[<boolean mask>, cols of interest] = some scalar or calculated value 

這樣的:

df.loc[(df['Age_MDB_S'] >= 1) & (df['Age_MDB_S'] <= 25), 'Age_GroupA'] = 1 

你也可以這樣做使用np.where

df['Age_GroupA'] = np.where((df['Age_MDB_S'] >= 1) & (df['Age_MDB_S'] <= 25), 1, 0) 

要在1號線做到這一點,有很多方法可以做到這

+0

謝謝 - 非常棒,我認爲我現在得到了doc邏輯 – jeangelj

+0

@jeangelj這裏的微妙錯誤是你在中間部分的掩碼是你指定的'1',但是這個鏈接到lhs,所以所有的行都被分配到1 – EdChum

+0

我看到了;我肯定看到了loc在np.where和其他方法上的優勢;所以非常感謝你 – jeangelj

3

可以布爾蒙版轉換int - True1False0

df['Age_GroupA'] = ((df['Age'] >= 1) & (df['Age'] <= 25)).astype(int) 
print (df) 
    User ID  Age Age_GroupA 
0 35435   22   1 
1 45345   36   0 
2 63456   18   1 
3 63523   55   0 
1

這對我有效。耶茲列爾已經解釋了它。

dataframe['Age_GroupA'] = ((dataframe['Age'] >= 1) & (dataframe['Age'] <= 25)).astype(int)