如何避免出现ValueError?

时间:2018-08-07 07:36:16

标签: python pandas

我有一个等效的工作代码

def foo(x):
    if (df.A == 0 or df.B > df.C):
        return 0
    else:
        return (*some stuff*)

df['D'] = df.apply(lambda x: foo(x),axis=1)

当然

_.apply(...,axis=1)_ 

太慢了,我想高效地做到。我尝试了以下方法:

crit = (df.A != 0 and df.B <= df.C) #this is just the negation of the previous boolean
df['D'] = 0 
df.loc[crit,'D'] = (*some stuff*)

在这里,我得到一个错误:

_ValueError_, _the truth value of a Series is ambiguous_

如果我的 crit 只有一个子句,则可以正常工作。我在这里缺少什么,如何解决?我必须承认,我很难理解熊猫是如何做这些事情的。

3 个答案:

答案 0 :(得分:1)

尝试:

crit = ((df.A != 0) & (df.B <= df.C)) 

答案 1 :(得分:1)

使用“&”代替“ and”。答案here

中对此进行了解释

答案 2 :(得分:0)

类似的事情应该起作用。为您的D列设置默认值,然后将该值替换为与您的查询匹配的行。

some_default_value = -1
df["D"] = some_default_value
df.loc[(df.A == 0) | (df.B > df.C), "D"] = 0