更多的真理价值是模棱两可的

时间:2015-01-23 16:14:14

标签: python numpy pandas conditional

我在堆栈溢出中遇到了很多问题,但仍然无法解决这个问题。我知道它返回了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

1 个答案:

答案 0 :(得分:0)

DataFrame的每一列都是Series的值,而不是标量,因此您的逻辑表达式为:

((stratData['Ratio'].shift(1) < 1) &
 (stratData['60'].shift(1) < stratData['Ratio'].shift(1)))

将评估为Series类型bool,而不是标量。假设某些元素是True而另一些元素是False - 是否应该执行if语句下的下一行?这是模棱两可的。因此,if语句必须始终后跟一个可以安全地转换为标量布尔值的表达式。

查看你的代码,你可能会尝试做两件完全不同的事情之一:

  1. “如果系列中所有元素都是True,那么将{em>所有值'pos'列中的值设置为-1”。在这种情况下,你可以这样做:

    if np.all((stratData['Ratio'].shift(1) < 1) &
              (stratData['60'].shift(1) < stratData['Ratio'].shift(1))):
        stratData['pos'] = -1
    
  2. “对于系列中<{1}}的每个元素,请将True列中的对应元素设置为{{ 1}}”。在这种情况下,您可以将该系列用作'pos'的布尔索引:

    -1
  3. 我的猜测是你可能想要选项#2。


    我看到你编辑了你的问题。既然你说“使用[idx]”我认为选项2就是你想要的。如果要测试多个条件,则可以简单地生成多组布尔索引,例如:

    stratData['pos']