使用 Python 获取 KeyError: 9,复制数据帧

Getting KeyError: 9 with Python, Copy of a Dataframe

提问人:OMeihls 提问时间:10/13/2023 更新时间:10/13/2023 访问量:63

问:

我正在尝试在 google colab 中循环浏览 DataFrame,到目前为止它一直在工作,但我遇到了一个问题。我创建了一个数据帧的副本,删除了相关列中包含 NaN 的行,并且循环不再起作用。我收到 KeyError: 9。

def findJobsCertAnn(thresholdYear):
  jobCount = 0
  for i in range(jobsDFCopy.shape[0]):
    if (thresholdYear - 1) < jobsDFCopy['Years Since Approval'][i] <= thresholdYear:
        jobCount += jobsDFCopy['Certified Jobs'][i]
  return jobCount

这应该返回列中的作业数,但只返回在特定边界之间具有“自批准以来的年数”值的列。对于“门槛年”,我使用数字 1 到 9,尽管我觉得这无关紧要。

奇怪的是,它在原始 DataFrame 中正常工作,而不是在副本中正常工作。 这是它的工作原理:

def findCompCertAnn(threshold):
  rowNum = 0
  for i in range(df.shape[0]):
    if (threshold - 1) < df['Years Since Approval'][i] <= threshold:
      rowNum += 1
  return rowNum

此处的预期结果是返回“自批准以来的年数”列中值在所述范围内的行数,与之前相同。我在这里没有遇到关键错误。

我不确定问题是什么,但我猜它出在我复制 DataFrame 的方式上。 以下是我复制 DataFrame 的方式:

jobsDFCopy = df.copy()

jobsDFCopy.dropna(subset=['Certified Jobs'], inplace=True)

它将删除“认证作业”列中包含“NaN”的行。

我尝试过访问和比较(使用 if 语句)并遍历 JobsDFCopy 中的值,只是为了看看它是否有效,它确实有效,但当我尝试在此函数中执行此操作时,它没有。

任何帮助都非常感谢。

以下是 Colab 的完整错误:

KeyError                                  Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   3801             try:
-> 3802                 return self._engine.get_loc(casted_key)
   3803             except KeyError as err:

6 frames
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

KeyError: 9

The above exception was the direct cause of the following exception:

KeyError                                  Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   3802                 return self._engine.get_loc(casted_key)
   3803             except KeyError as err:
-> 3804                 raise KeyError(key) from err
   3805             except TypeError:
   3806                 # If we have a listlike key, _check_indexing_error will raise

KeyError: 9
Python Pandas DataFrame 循环 google-colaboratory

评论

1赞 Tim Roberts 10/13/2023
请记住,您使用的语法是按 KEY 获取的,而不是按行号获取的。当你 时,键不会重新编号,所以你现在有间隙。也许你想要。你有没有打印出来看看它到底是什么样子的?dropnailocjobsDFCopy
1赞 NotAName 10/13/2023
或者干脆在 之后运行 call ,但在这种情况下,您必须删除选项并返回一个值。reset_index()dropna()inplace=True
1赞 kelvt 10/13/2023
问题是行索引与 的形状不匹配。使用 will work,但您也可以使用 instead of 代替和访问行值df.ilocfor index, row in jobsDFCopy.iterrows():for i in range(jobsDFCopy.shape[0]):row['Years Since Approval']jobsDFCopy['Years Since Approval'][i]
0赞 OMeihls 10/13/2023
@TimRoberts,我确实打印了 JobsDFCopy,它看起来与原始 df 相同。为了回应大家,我会尝试使用iloc,我只是以前没有使用过。将更新结果。
0赞 OMeihls 10/13/2023
我最终按照 NotAName 的建议做了,它奏效了。谢谢大家!

答: 暂无答案