模棱两可的真值 - 对于循环和 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

如有任何帮助,我们将不胜感激。

使用.iloc[[i]]返回一个Series。因此,即使Series中只有一个值,也会出现ValueError,因为您正在比较Seriesstr

处理此问题的一种方法是使用.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"

编辑根据@6502对OP代码中可能存在错误的观察,更新了elif语句。还决定去除CCD_ 11中CCD_。

最新更新