更多的真值是模糊的

2024-10-03 09:18:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我在stack overflow中遇到了很多问题,但仍然无法解决这个问题。我知道它返回Bool etc,但基本上我想对一个数据帧应用多个条件(If And Else,Else If…),但如果要求您使用any(),all()

代码如下:

if (stratData['Ratio'].shift(1) < 1) & (stratData['60'].shift(1) < stratData['Ratio'].shift(1)):
    stratData['pos'] = -1
else:
    stratData['pos'] = 1

我希望这能起作用,并为stratData['pos']列添加进一步的条件。我试过创建一个myfunc=lambda。。。我也试过了np.哪里. 谢谢你的帮助!你知道吗

编辑:我应该早点发布,但我想做多个条件,所以除了使用[idx]的TRUE-FALSE

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

Tags: and数据posifshiftstacketc条件
1条回答
网友
1楼 · 发布于 2024-10-03 09:18:26

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

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

将计算为bool类型的Series,而不是标量。假设有些元素是True,有些是False,那么if语句下的下一行是否应该执行?这是模棱两可的。因此,if语句后面必须始终跟一个表达式,该表达式可以安全地转换为标量布尔值。你知道吗

查看代码时,您可能会尝试执行两种完全不同的操作之一:

  1. “如果序列中元素的allTrue,则将'pos'列中值的all设置为-1”。在这种情况下,您可以:

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

    idx = ((stratData['Ratio'].shift(1) < 1) &
           (stratData['60'].shift(1) < stratData['Ratio'].shift(1)))
    stratData[idx]['pos'] = -1
    

我猜你可能想要第二种选择。你知道吗


我看你已经修改了你的问题。既然你说“使用[idx]”,我想选项2就是你想要的。如果您想测试多个条件,那么您可以简单地生成多组布尔索引,例如:

idx1 = ((stratData['Ratio'].shift(1) < 1) &
        (stratData['60'].shift(1) < stratData['Ratio'].shift(1)))
stratData[idx1]['pos'] = -1

idx2 = ((stratData['Ratio'].shift(1) > 1) &
        (stratData['60'].shift(1) > stratData['Ratio'].shift(1)))
stratData[idx2]['pos'] = 1

# NB: "~" means "bitwise not" and "|" means "bitwise or"
idx3 = ~(idx1 | idx2)
stratData[idx3]['pos'] = 0

相关问题 更多 >