首页 > 解决方案 > 模棱两可的真值 - For 循环和 If 语句

问题描述

追查以下错误消息背后的原因。

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

这是我正在运行的代码:

anz_analysis["Action"] = anz_analysis["Signal"]        

for i in range(0, len(anz_analysis) + 1):       
    if ((anz_analysis["Signal"].iloc[[i]] == "Buy") & (anz_analysis["Signal"].iloc[[i+1]] == "Buy")):
        anz_analysis["Action"] = anz_analysis["Signal"].iloc[[i]] = "Maintain"
    elif (anz_analysis["Signal"].iloc[[i]] = "Sell") & (anz_analysis["Signal"].iloc[[i+1]] = "Sell"):
        anz_analysis["Signal"].iloc[[i]] = "Maintain"

数据框如下所示:


Current: Wanted: 
_______|_________
1|Buy  | Buy
2|Buy  | Maintain
3|Buy  | Maintain
4|Sell | Sell
5|Sell | Maintain
6|Sell | Maintain

任何帮助,将不胜感激。

标签: pythonfor-loopif-statement

解决方案


使用.iloc[[i]]返回一个Series. 因此,即使 , 中只有一个值,Series也会ValueError出现,因为您正在将 aSeries与 a进行比较str

处理此问题的一种方法是使用.iloc[[i]][0]. 这将“提取”字符串并允许在相同类型之间进行比较。

更好的方法是使用 选择行和列iloc。例如

anz_analysis["Action"] = anz_analysis["Signal"]        

for i in range(len(anz_analysis) + 1):       
    if ((anz_analysis.iloc[i, 'Signal'] == "Buy") & (anz_analysis.iloc[i + 1, 'Signal'] == "Buy")):
        anz_analysis["Action"] = anz_analysis.iloc[i, 'Signal'] = "Maintain"
    elif (anz_analysis.iloc[i, 'Signal'] == "Sell") & (anz_analysis.iloc[i + 1, 'Signal'] == "Sell"):
        anz_analysis.iloc[i, 'Signal'] = "Maintain"

编辑elif根据@6502 对 OP 代码中可能错误的观察 更新了语句。0还决定删除in的虚假起始值range


推荐阅读