我在堆栈溢出中遇到了很多问题,但仍然无法解决这个问题。我知道它返回了Bool等但基本上我想将多个条件应用于DataFrame(如果还有其他,如果......)但是继续得到不明确的错误要求你使用any(),all()
以下是代码:
if (stratData['Ratio'].shift(1) < 1) & (stratData['60'].shift(1) < stratData['Ratio'].shift(1)):
stratData['pos'] = -1
else:
stratData['pos'] = 1
我希望这样做,并为stratData [&#39; pos&#39;]列添加更多条件。我试过创建一个myfunc = lambda ......我也试过np.where。感谢任何帮助!
编辑:我应该早些发布但我想做多个条件,所以超过真假使用[idx]
if (stratData['Ratio'].shift(1) < 1) & (stratData['60'].shift(1) < stratData['Ratio'].shift(1)):
stratData['pos'] = -1
elif (stratData['Ratio'].shift(1) > 1) & (stratData['60'].shift(1) > stratData['Ratio'].shift(1)):
stratData['pos'] = 1
else:
stratData['pos'] = 0
答案 0 :(得分:0)
DataFrame
的每一列都是Series
的值,而不是标量,因此您的逻辑表达式为:
((stratData['Ratio'].shift(1) < 1) &
(stratData['60'].shift(1) < stratData['Ratio'].shift(1)))
将评估为Series
类型bool
,而不是标量。假设某些元素是True
而另一些元素是False
- 是否应该执行if
语句下的下一行?这是模棱两可的。因此,if
语句必须始终后跟一个可以安全地转换为标量布尔值的表达式。
查看你的代码,你可能会尝试做两件完全不同的事情之一:
“如果系列中所有元素都是True
,那么将{em>所有值'pos'
列中的值设置为-1
”。在这种情况下,你可以这样做:
if np.all((stratData['Ratio'].shift(1) < 1) &
(stratData['60'].shift(1) < stratData['Ratio'].shift(1))):
stratData['pos'] = -1
“对于系列中<{1}}的每个元素,请将True
列中的对应元素设置为{{ 1}}”。在这种情况下,您可以将该系列用作'pos'
的布尔索引:
-1
我的猜测是你可能想要选项#2。
我看到你编辑了你的问题。既然你说“使用[idx]”我认为选项2就是你想要的。如果要测试多个条件,则可以简单地生成多组布尔索引,例如:
stratData['pos']