系列的真值含糊不清

时间:2019-09-19 13:54:57

标签: python pandas

当我运行以下函数时,Series的真值是模棱两可的错误。环顾网上看起来应该可以工作。我有什么想念的吗?我也对如何使用列表理解和循环中的两列感兴趣。

我尝试使用and和&得到一些东西。我尝试放入.any(),但是它仅使用第一条语句。我看着np.where,但我需要它与3 if语句一起使用,对此我没有任何运气。

我看到其他人问了这个问题,我再次问的原因是我的代码与multiple if else conditions in pandas dataframe and derive multiple columns的答案相同。

def before_after(df,col1, col2):
    if ((df[col1] >= 0) and (df[col2] >= 0)):
        return (((df[col2]-df[col1])/df[col1])*100)
    elif ((df[col1] < 0) and (df[col2] > 0)):
        return (((df[col2]-df[col1])/(df[col1].abs()))*100)
    elif ((df[col1] < 0) and (df[col2] < 0)):
        return (((df[col2]-df[col1])/df[col1])*100)

错误是:

  

ValueError:系列的真值不明确。使用空   a.bool(),a.item(),a.any()或a.all()。

1 个答案:

答案 0 :(得分:1)

您可以将numpy.select与按|条件链接的第一和第三条条件一起用于按位OR,因为相同的返回值(即使没有条件匹配)也会返回一些默认值,例如NaN

def before_after(df,col1, col2):
    m1 = (df[col1] >= 0) & (df[col2] >= 0)
    m2 = (df[col1] < 0) & (df[col2] > 0)
    m3 = (df[col1] < 0) & (df[col2] < 0)

    s1 = ((df[col2]-df[col1])/df[col1])*100
    s2 = ((df[col2]-df[col1])/(df[col1].abs()))*100

    return np.select([m1 | m3, m2], [s1, s2], default=np.nan)