在PyCharm中运行Jupyter代码时出现KeyError:5问题求助
解决PyCharm中Pandas代码的KeyError问题
先看你抛出的错误栈,问题直接指向循环里的这一行代码:
and not df_ticker.Close[i-1] >= df_ticker [i-2]:
错误根源
这里的df_ticker [i-2]是典型笔误:当你直接给DataFrame加方括号+整数时,Pandas会默认你要取列名为该整数的列,但你的数据里根本没有列名为5的字段,所以直接抛出了KeyError:5。
你真正想实现的应该是比较上上个行的Close值,所以这里必须明确指定列名,写成df_ticker.Close[i-2](或者df_ticker['Close'][i-2])。
修正后的代码片段
把循环里的条件语句改成下面这样就行:
for i in range(1, len(df_ticker)): if df_ticker.Close[i] > df_ticker.Close[i-1] and df_ticker.Red[i] == False and \ df_ticker.Value.round(decimals = 0)[i] >= df_ticker.Value.round(decimals = 0)[i-1] \ and not df_ticker.Close[i-1] >= df_ticker.Close[i-2]: rise.append(df_ticker.Close[i])
额外说明:为什么Jupyter里能正常运行?
大概率是你在Jupyter中写的代码是正确的(完整写了.Close),但复制到PyCharm时不小心漏掉了这个部分,才导致了语法逻辑错误。其实如果在Jupyter里写错同样会报KeyError,只是你可能没注意到这个细节~
另外给你个小建议:在Pandas里尽量避免直接用[i]按位置索引,推荐用.iloc[i]来明确按位置取行,代码可读性更高,也能减少这类笔误,比如:
for i in range(1, len(df_ticker)): # 先把需要用到的值单独取出来 current_close = df_ticker['Close'].iloc[i] prev_close = df_ticker['Close'].iloc[i-1] prev_prev_close = df_ticker['Close'].iloc[i-2] current_red = df_ticker['Red'].iloc[i] current_value = df_ticker['Value'].round(0).iloc[i] prev_value = df_ticker['Value'].round(0).iloc[i-1] if current_close > prev_close and not current_red and \ current_value >= prev_value and not prev_close >= prev_prev_close: rise.append(current_close)
内容的提问来源于stack exchange,提问作者Wneb
相关产品推荐
相关产品推荐

