1

我有一个带有年龄的数据框 df,我正在将文件分类为 0 和 1 的年龄组。

东风:

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

谢谢

4

3 回答 3

3

您可以将布尔掩码转换为int- Trueare1Falseare 0

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
于 2017-04-10T13:53:50.560 回答
3

由于同侪压力(@DSM),我不得不分解您的错误:

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

这是链式索引/分配

所以你接下来尝试了什么:

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 行中执行此操作,有很多方法可以执行此操作

于 2017-04-10T14:00:56.043 回答
1

这对我有用。耶斯瑞尔已经解释过了。

 dataframe['Age_GroupA'] = ((dataframe['Age'] >= 1) & (dataframe['Age'] <= 25)).astype(int)
于 2017-07-28T19:55:54.213 回答