2017-08-25 140 views
0

我有一个数据帧,我想根据现有的列创建一个新列,其中的值非空。熊猫根据另一列的非空值创建一个新列

现有列以小数为单位,有些行为空。我想在整数中创建一个新的列。

我正在使用lambda但不断收到语法错误。谁能告诉我什么是错的?由于

df['new'] = df['old'].apply(lambda x: int(x) if x>=0) 

我也试过:

df['new'] = df['old'].apply(lambda x: int(x) if x.isnull == False) 

这一个:

df['new'] = df['old'].apply(lambda x: x.astype(int) if x>=0) 

语法错误指向最后一个右括号。

回答

1

由于您的lambda函数不正确,您的语法错误。具体而言,if ... else ...conditional expression是错误的。条件表达式必须是

conditional_expression ::= or_test [“if” or_test “else” expression] 

您错过了else部分。

我想提的另一件事是转换数据类型的优雅方式是使用astype function。如果你想投的一些条件数据,你可以做这样的:

new = df.loc[df.old>0].astype('int') 

然后new将成为你需要一个系列。

谢谢。

1
df['new'] = df['old'].apply(lambda x: int(x) if x>=0) 

您需要在三元运算符的末尾有一个else

df['new'] = df['old'].apply(lambda x: int(x) if x>=0 else 'Nope') 
+0

有什么办法可以在lambda中使用elif?例如,如果我根据三种不同的条件应用三种不同的值?谢谢。 – RJL

+0

你不能在lambda表达式中声明,所以不,至少不是这种形式。但是,您可以*连锁三元运算符:'val_1 if else if ....' – Solaxun

相关问题