当我运行以下函数时,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()。
答案 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)