使用多个If-else的Pandas变量创建

Bak*_*war 1 python if-statement where pandas

需要帮助Pandas多个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
Run Code Online (Sandbox Code Playgroud)

其中Id是乘客ID.我想在此数据框中创建一个新的标志变量,该变量具有以下规则:

if Sex=="female" or (Pclass==1 and Age <18) then 1 else 0. 
Run Code Online (Sandbox Code Playgroud)

现在,我尝试了几种方法.这就是我第一次接近的方式:

df=pd.read_csv(data.csv)
for passenger_index,passenger in df.iterrows():
    if passenger['Sex']=="female" or (passenger['Pclass']==1 and passenger['Age']<18):
       df['Prediction']=1
    else:
       df['Prediction']=0
Run Code Online (Sandbox Code Playgroud)

上面代码的问题是它在df中创建一个Prediction变量,但所有值都为0.

但是,如果我使用相同的代码,而是将其输出到字典,它会给出正确的答案,如下所示:

prediction={}
df=pd.read_csv(data.csv)
for passenger_index,passenger in df.iterrows():
    if passenger['Sex']=="female" or (passenger['Pclass']==1 and passenger['Age']<18):
       prediction[passenger['ID']=1
    else:
       prediction[passenger['ID']=0
Run Code Online (Sandbox Code Playgroud)

这给出了基于上述逻辑将密钥作为ID并且值为1或0的dict预测.

那么为什么df变量工作错误呢?我甚至尝试先定义一个函数然后调用它.和第一个一样.

那么,我们怎么能在熊猫中做到这一点?

其次,如果我们可以使用一些多个if-else语句,我想也可以这样做.我知道np.where但它不允许添加'和'条件.所以这就是我的尝试:

df['Prediction']=np.where(df['Sex']=="female",1,np.where((df['Pclass']==1 and df['Age']<18),1,0)
Run Code Online (Sandbox Code Playgroud)

上面给出了'和'关键字的错误.

有人可以帮忙吗?使用np.where(简单的if-else之类)和使用某些函数(applymap等)或修改我之前写的内容的多个方法的解决方案将非常感激.

另外我们如何使用df的一些applymap或apply/map方法做同样的事情?

unu*_*tbu 7

df.iterrows您可以使用(相对较慢)循环遍历行,而不是Prediction在一个赋值中为列分配所需的值:

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
Run Code Online (Sandbox Code Playgroud)

对于第一种方法,请记住df['Prediction']代表整列df,因此df['Prediction']=1将值1分配给该列中的每一行.由于df['Prediction']=0是最后一次分配,整个列最终都填充了零.

对于第二种方法,请注意您需要使用&不对两个NumPy数组或Pandas NDFrame and执行元素逻辑和操作.因此,你可以使用

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])
Run Code Online (Sandbox Code Playgroud)

虽然我认为只使用|逻辑 - 或&逻辑 - 和更简单:

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
Run Code Online (Sandbox Code Playgroud)