Lambda表达式中的多个if语句

时间:2019-12-17 10:48:17

标签: python pandas lambda

我正在对数据帧中的类别变量进行编码。我找到了一个很好的pythonic方法来使用lambda表达式。例如,下面的代码行将性别类别“ male”和“ female”(编码为字符串)替换为值0和1。

train_frame['Sex'] = train_frame['Sex'].apply(lambda x : 1 if x =='male' else 0)

现在我的问题是,我是否也可以这样做,但是要针对两个以上类别? (如果在表达式中这么说,则大于1)。

我正在尝试在人们登船的地方做这个,我想用整数代表人们登船的地方(一些背景信息:S =南安普敦,C =瑟堡,Q =皇后镇)

我试图做这样的事情,但是不起作用:

#Southampton = 0, Cherbourg = 1, Queenstown = 2
train_frame['Embarked'] = train_frame['Embarked'].apply(lambda x: 0 if x =='S', 1 if x=='C' else 2 )

有人可以向我解释一下是否可以使用具有多个if语句的lambda表达式吗?,而且有点题外话:在数据帧中是否有更多的Python方式编码分类?

3 个答案:

答案 0 :(得分:2)

一种方法是使用dict

例如:

data = {'S': 0, 'C': 1}
train_frame['Embarked_N'] = train_frame['Embarked'].map(data).fillna(2)

答案 1 :(得分:2)

如果可以避免的话,通常不建议使用.apply。在这种情况下,我建议您使用.get_dummiesscikit-learn's transformers。因为您可能希望将它们编码为多列。或者,您可以使用replace

train_frame['Sex'] = train_frame['Sex'].replace({
    "S": 0,
    "C": 1,
    "X": 2,
})

如果您确实想要defaultdict,则可以使用else。但是我建议您不要使用get_dummies或sklearn(请注意,如果出于某种原因将它们全部放在一列中,sklearn具有label_binarizer)。

答案 2 :(得分:1)

尝试

   lambda x: 0 if x== 'S' else 1 if x == 'C' else 2
相关问题