【问题标题】:How to solve a Key Error 19 problem with pandas?如何解决 Pandas 的 Key Error 19 问题?
【发布时间】:2020-10-24 21:17:56
【问题描述】:

我一直在使用 pandas 处理数据帧,在清理这些数据时,我遇到了迭代问题...

例如(我试图定位错误):

N_index = df.shape[0]
j = 0
while j < N_index:
  print(j, df.diag_1[j][0],'squalala')
  j += 1

这个显示这个:

0 2 squalala
1 2 squalala
2 6 squalala
3 8 squalala
4 1 squalala
5 4 squalala
6 4 squalala
7 4 squalala
8 3 squalala
9 4 squalala
10 2 squalala
11 1 squalala
12 4 squalala
13 4 squalala
14 5 squalala
15 9 squalala
16 4 squalala
17 6 squalala
18 4 squalala
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in get_loc(self, key, method, tolerance)
   2890             try:
-> 2891                 return self._engine.get_loc(casted_key)
   2892             except KeyError as err:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

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: 19

并且由于某些原因(idk which)在第 18 个索引之后,它无法工作,所以如果您对如何修复它有任何想法或者它为什么会这样做,我将非常感谢您。

PS。我在示例中使用了 while 循环而不是 for 循环,但我都尝试了,因为我在另一个 Stack Overflow 帖子上看到这解决了他们的问题,对我来说它没有 ^^

PSS。我正在使用笔记本

编辑:这里我正在做一个df.diag_1[j][0],因为我想访问我的数据框的 diag_1 列中第 j 行的字符串的第一个元素 -

【问题讨论】:

  • 您混淆了行和列。 df.shape[0] 返回数据框中的行数。但是,当您执行此 df[j][0] 时,j 将引用数据框中的列。
  • 在我看来,他正在尝试索引名为diag_1 的列的行,或者?
  • @BraulioBarahona 就是这个想法,我想访问我的数据框 diag_1 列中 j 行的字符串的第一个元素
  • @Pukki 查看我输入的代码 sn-p,索引应该可以工作

标签: python pandas dataframe keyerror


【解决方案1】:

KeyError: 19 表示程序正在尝试获取第 19 个元素,但它不存在。

您可以尝试直接打印 df 吗?我怀疑第 19 行的索引不是 19。为了重置索引,您可以这样做:

df.reset_index(drop=True)

【讨论】:

    【解决方案2】:

    也许您在其他地方有问题,索引应该可以工作,请参阅:

    df = pd.DataFrame({"one":["1X","2Y","3Z"]})                                                                          
    N_index = df.shape[0]                                                                                                
    j=0                                                                                                                  
    
    while j < N_index: 
     print(j, df.one[j][0]) 
     j += 1 
    

    为确保索引按预期工作,只需在尝试查找循环中的行之前重置索引:

    df.reset_index()
    

    这里是一个例子,当你索引不是标准的 0 到 N-1 行时:

    df = pd.DataFrame({"one":["1X","2Y","3Z"]})
    df['new_index'] = range(2,5) 
    df = df.set_index("new_index") 
    print(df)
    
    # reset the index to make your loop work
    df=df.reset_index() 
    
    N_index = df.shape[0]                                                                                                
    j=0                                                                                                                  
    
    while j < N_index: 
     print(j, df.one[j][0]) 
     j += 1 
    

    注意一般来说不需要像你一样循环遍历pandas数据框,例如使用apply方法,例如:

    out= df.one.apply(lambda x:x[1])
    

    将为您提供每行中字符串的第二个元素。以 pandas 文档为例:10-minutes to pandas;或此处涉及索引的多个问题。

    【讨论】:

    • 谢谢,我会看看问题是否来自其他地方,因为我看到旅游代码有效...我仍在调查我的问题,谢谢!
    【解决方案3】:

    我的调查继续进行,当我执行df.head(25) 时,我可以看到不同的索引如下:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 22 23 24 25 26 27

    如您所见,缺少从 19 到 21 的索引(可能来自之前完成的 dropna()。所以错误可能来自这里,因为正如你们中的一些人提到的那样,这些索引不存在。

    所以我可以通过以下方式访问现有索引:

    for j in df.index:
      print(j, df.diag_1[j][0]): 
    
    

    这样就解决了问题。

    【讨论】:

    • 您确定此重新索引有效吗?它不会将 NaN 返回到已删除的索引吗?
    • @BraulioBarahona 实际上我编辑了这篇文章,但它似乎没有保存,所以我会再做一次
    猜你喜欢
    • 2020-10-20
    • 2021-05-14
    • 2020-08-10
    • 2022-01-22
    • 2020-06-08
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多