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方法做同样的事情?
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)