如何对比pandas DataFrame最后一行与倒数二三行并解决ValueError问题
报错原因
你遇到的ValueError是因为Pandas的Series不支持Python原生的链式比较语法a < b < c:Python会先执行dataframe['tema'] < dataframe['tema'].shift(1)得到一个布尔类型的Series,再尝试把这个Series和后续值做大小比较,此时Pandas无法直接判断一个Series的整体布尔值,就会抛出这个歧义错误。
三行数据对比实现方法
shift()方法的参数就是偏移行数:
shift(1):取当前行的上一行(相对于最后一行而言就是倒数第二行)shift(2):取当前行往上数第二行,也就是你需要的倒数第三行
如果你的需求是最后一行的tema < 倒数第二行的tema < 倒数第三行的tema,需要把链式比较拆成两个独立条件,用&连接,每个条件单独加括号避免运算符优先级问题:
(dataframe['tema'] < dataframe['tema'].shift(1)) & (dataframe['tema'].shift(1) < dataframe['tema'].shift(2))
完整修改后的代码
dataframe.loc[ ( # Scontents : data value is above 70 (qtpylib.crossed_above(dataframe['avg'], self.sell_avg.value)) & (dataframe['tema'] > dataframe['bb_middleband']) & # Guard: tema above BB middle # 三行对比逻辑:当前行tema < 上一行tema < 上两行tema (dataframe['tema'] < dataframe['tema'].shift(1)) & (dataframe['tema'].shift(1) < dataframe['tema'].shift(2)) ), 'execute02'] = 1 return dataframe
补充说明
- 如果你的对比逻辑不是连续递减,只要调整对应比较符即可,比如要判断最后一行同时小于上两行,就写成
(dataframe['tema'] < dataframe['tema'].shift(1)) & (dataframe['tema'] < dataframe['tema'].shift(2)) - 数据前两行因为没有足够的历史行,
shift(2)会返回NaN,对应的条件结果为False,不会被赋值,符合业务逻辑无需额外处理。
内容的提问来源于stack exchange,提问作者Djoko
相关产品推荐
相关产品推荐

