Python 使用多个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

需要多个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   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