Python 使用多个If-else创建变量
需要多个IF-ELSE语句的帮助。我有一个测试数据集(泰坦尼克号),如下所示:Python 使用多个If-else创建变量,python,if-statement,pandas,where,Python,If Statement,Pandas,Where,需要多个IF-ELSE语句的帮助。我有一个测试数据集(泰坦尼克号),如下所示: ID Survived Pclass Name Sex Age 1 0 3 Braund male 22 2 1 1 Cumings, Mrs. female 38 3 1 3 Heikkinen, Miss. Laina female 26 4 1 1 Futrelle, Mrs. female 35 5 0 3 Al
ID Survived Pclass Name Sex Age
1 0 3 Braund male 22
2 1 1 Cumings, Mrs. female 38
3 1 3 Heikkinen, Miss. Laina female 26
4 1 1 Futrelle, Mrs. female 35
5 0 3 Allen, Mr. male 35
6 0 3 Moran, Mr. male
7 0 1 McCarthy, Mr. male 54
8 0 3 Palsson, Master male 2
其中Id是乘客Id。我想在此数据框中创建一个新的标志变量,该变量具有以下规则:
if Sex=="female" or (Pclass==1 and Age <18) then 1 else 0.
如果Sex==“female”或(Pclass==1和Age而不是使用df.iterrows
(相对较慢)在行中循环,则可以在一次赋值中为预测
列指定所需的值:
In [27]: df['Prediction'] = ((df['Sex']=='female') | ((df['Pclass']==1) & (df['Age']<18))).astype('int')
In [29]: df['Prediction']
Out[29]:
0 0
1 1
2 1
3 1
4 0
5 0
6 0
7 0
Name: Prediction, dtype: int32
虽然我认为只使用
表示逻辑or和&
表示逻辑and要简单得多:
In [34]: ((df['Sex']=='female') | ((df['Pclass']==1) & (df['Age']<18)))
Out[34]:
0 False
1 True
2 True
3 True
4 False
5 False
6 False
7 False
dtype: bool
[34]中的:((df['Sex']='female')|((df['Pclass']==1)和(df['Age']而不是使用df.iterrows
(相对较慢)在行中循环,您可以在一次赋值中为预测
列指定所需的值:
In [27]: df['Prediction'] = ((df['Sex']=='female') | ((df['Pclass']==1) & (df['Age']<18))).astype('int')
In [29]: df['Prediction']
Out[29]:
0 0
1 1
2 1
3 1
4 0
5 0
6 0
7 0
Name: Prediction, dtype: int32
虽然我认为只使用
表示逻辑or和&
表示逻辑and要简单得多:
In [34]: ((df['Sex']=='female') | ((df['Pclass']==1) & (df['Age']<18)))
Out[34]:
0 False
1 True
2 True
3 True
4 False
5 False
6 False
7 False
dtype: bool
In[34]:((df['Sex']='femal')|((df['Pclass']==1)和(df['Age']Hi@unutbu。这很有帮助。一个疑问。当你说第一种方法时,df['Prediction']=1在所有行中添加了1,我不确定我是否理解这背后的原因。我使用了:对于乘客索引,乘客在df.iterrows()中:如果乘客['Sex']==“femal”或(乘客['Pclass']==1和乘客['Age']就像在SAS、SPSS等工具中一样,如果我写下相同的条件,并说Prediction=1,否则Prediction=0,它将根据条件使用一个新的变量Prediction,如果条件为true,那么Prediction为1,否则为0。我猜它工作的原因是因为SAS、SPSS一次读取一条记录,然后在该r上执行代码中提到的操作因此,本质上我们在这里也通过调用df.iterrows()进行了相同的操作要一次读取一条记录,然后使用它的条件?为什么它不能工作?谢谢你的帮助!即使你的<代码> for循环正在重复行< <代码> df>代码>,但是你的任务是引用整个列,而不是一行。
您得到的是整个列,而不仅仅是一行。df['Prediction']
并没有上下文化来引用一行,仅仅因为它位于for循环中。
。Python不是这样工作的。更清楚的是,df['Prediction']=1
为列中的每个值分配1,但不会为列中的每个值添加1。若要为每个值添加1,请使用df['Prediction']+=1
。在for循环中,如果将df['Prediction']=1
替换为乘客['Prediction']=1
,则将添加一个新的“列”到乘客
行,但这不会影响df
,因为乘客
是df
行的副本,而不是df
中底层数据的视图。因此,这也不是实现目标的正确方法。您好@unutbu。这很有帮助。有一个疑问。当您谈到第一种方法时,df['Prediction']=1在所有行中添加1,我不确定我是否理解这背后的原因。我使用了:对于乘客索引,df.iterrows()中的乘客:如果乘客['Sex']==“female”或(乘客['Pclass']==1和乘客['Age']就像在SAS、SPSS等工具中一样,如果我写下相同的条件,并说Prediction=1,否则Prediction=0,它将根据条件使用一个新的变量Prediction,如果条件为true,那么Prediction为1,否则为0。我猜它工作的原因是因为SAS、SPSS一次读取一条记录,然后在该r上执行代码中提到的操作因此,本质上我们在这里也通过调用df.iterrows()进行了相同的操作要一次读取一条记录,然后使用它的条件?为什么它不能工作?谢谢你的帮助!即使你的<代码> for循环正在重复行< <代码> df>代码>,但是你的任务是引用整个列,而不是一行。
您得到的是整个列,而不仅仅是一行。df['Prediction']
并没有上下文化来引用一行,仅仅因为它位于for循环中。
。Python不是这样工作的。更清楚的是,df['Prediction']=1
为列中的每个值分配1,但不会为列中的每个值添加1。若要为每个值添加1,请使用df['Prediction']+=1
。在for循环中,如果将df['Prediction']=1
替换为乘客['Prediction']=1
,则将添加一个新的“列”到乘客
行,但这不会影响df
,因为乘客
是df
行的副本,而不是查看df
中的基础数据。因此,这也不是实现目标的正确方法。
In [32]: np.where(df['Sex']=='female', 1, np.where((df['Pclass']==1)&(df['Age']<18), 1, 0))
Out[32]: array([0, 1, 1, 1, 0, 0, 0, 0])
In [34]: ((df['Sex']=='female') | ((df['Pclass']==1) & (df['Age']<18)))
Out[34]:
0 False
1 True
2 True
3 True
4 False
5 False
6 False
7 False
dtype: bool