当前位置: 首页 > 知识库问答 >
问题:

为什么pandas iloc()中使用df.iloc[[i][0]]会导致特定行为?

韶镜
2024-09-17

pandas中iloc()函数的参数问题
我刚刚开始学习pandas,在一份代码中出现了df.iloc[[1][0]](df是shape为(60935, 54)的pd.DataFrame数据类型)的调用,从代码上下文上理解df.iloc[[1][0]]应该是df的一行,但是应该如何理解[[1][0]]呢?为什么iloc[]中的参数会允许接受两个相邻的列表?iloc[]内部是如何处理的?这显然不是对行与列的索引。并且,我发现第二个数字不是0-1时会出现索引出界的错误。这又是为什么呢?

我做了如下试验

mydict = [{'a': 1, 'b': 2, 'c': 3, 'd': 4},
          {'a': 100, 'b': 200, 'c': 300, 'd': 400},
          {'a': 1000, 'b': 2000, 'c': 3000, 'd': 4000}]
df = pd.DataFrame(mydict)
print(df.iloc[[0][-1]].shape)
    输出为(4,)
print(df.iloc[[0][0]].shape)
    输出为(4,)
print(df.iloc[[0]].shape)
    输出为(1, 4)
print(df.iloc[[0][1]].shape)
    输出为IndexError: list index out of range
print(type(df.iloc[[0]]))
    输出为<class 'pandas.core.frame.DataFrame'>
print(type(df.iloc[[0][0]]))
    输出为<class 'pandas.core.series.Series'>

共有1个答案

柯鸿云
2024-09-17

在pandas中,iloc函数用于基于位置的索引,它接受整数、整数切片对象、整数列表、整数列表的列表(或任何一维数组)作为索引器。对于你的问题,关键在于理解[[1][0]]这种嵌套列表的索引方式。

解释 df.iloc[[1][0]]

  • [1] 是一个包含单个元素(整数1)的列表。
  • [1][0] 则是从包含单个元素的列表中取出第一个(也是唯一一个)元素,即整数1。
  • 因此,df.iloc[[1][0]] 等同于 df.iloc[1],即选取df中索引为1的行(注意,pandas中的索引是从0开始的)。

但是,由于你使用了双重列表[[1][0]],pandas实际上将其视为一个列表的列表(即二维列表),其中内部列表包含一个整数。在pandas的iloc中,这种二维列表的索引方式被特殊处理为返回单行或多行作为DataFrame的视图,但如果内部列表仅包含一个元素,pandas会进一步将这个结果降维为Series(除非明确指定了列)。

为什么 df.iloc[[0][-1]].shape(4,)

  • 类似于上面的解释,[0][-1] 也是从列表[0]中取出最后一个元素(也是唯一一个元素),即0。
  • 因此,df.iloc[[0][-1]] 等同于 df.iloc[0],即选取索引为0的行。
  • 但由于你使用了双重列表(尽管这里看起来是多余的),pandas返回了一个Series(默认行为,除非你指定了列),Series的.shape属性返回一个元组,表示其长度(即行数),因此是(4,),这里4是DataFrame中列的数量。

为什么 df.iloc[[0][1]].shape 会引发 IndexError

  • 在这个例子中,[0][1] 试图从列表[0]中取出索引为1的元素,但列表[0]只有一个元素(索引为0的元素),所以索引1不存在,因此引发IndexError

结论

  • 使用df.iloc[[index]](其中index是整数)时,返回的是DataFrame的一个子DataFrame(单行)。
  • 使用df.iloc[index](直接传递整数)时,返回的是Series(单行,除非明确指定了列)。
  • 使用嵌套的列表(如[[index]])时,pandas会保持返回类型为DataFrame,但如果你使用[[index][some_index]]some_index不是0(或列表的有效索引),则可能遇到IndexError,因为你试图从一个仅包含一个元素的列表中取出不存在的元素。

希望这能帮助你更好地理解pandas中iloc的使用和内部处理机制。

 类似资料:
  • 和之间有什么区别? 我认识到表示矩阵的-行(平行形状),但表示矩阵的-行类似于垂直形状。 我想知道为什么显示垂直形状。

  • 计算数组长度有一个众所周知的模式: 此模式适用于静态数组和恒定大小的自动数组。它也适用于C99中的可变长度数组。 我想应用类似的想法来计算动态数组的大小(以字节为单位): 这比 更好不是指实际的数组元素类型。因此,它不需要代码的读者知道类型。 然而,我不清楚表达式是否会导致未定义的行为。随着它的扩展: 如果为,则结果表达式有问题: 根据C99标准: (C99,6.3.2.3p3):“具有值 运算符

  • 我用ASP.NET c#和angular 8开发了一个web API。我尝试在服务器端(使用NPOI)将一些数据从Oracle导出到Excel文件,并在客户端下载。我可以看到内存流有数据,但是在“返回响应”中,它没有返回给客户端,而是再次调用了函数。这是我的代码: 超文本标记语言: 键入脚本: API 控制器: DAL:(生成excel的最后一个函数。) 这是我在chrome调试器中看到的:[Ne

  • 问题内容: 带有此文件的ImageIO.read(imagePath)给出了CMMException,为什么Java无法处理此看似有效的文件http://www.jthink.net/jaikoz/scratch/front.jpg 问题答案: 我想我掌握了您的问题。我检查了您链接的图像(http://www.jthink.net/jaikoz/scratch/front.jpg)。其归因于Exi

  • 问题内容: 好吧,我试图理解并阅读可能导致它的原因,但我却无法理解: 我的代码中有这个地方: 事实是,当它尝试调用某些方法时,它将引发而不是其他预期的异常(特别是)抛出 。我实际上知道调用了什么方法,所以我直接转到该方法代码,并为应该抛出的行添加了一个块 ,它实际上按预期抛出。然而,当它上升时,以某种方式更改了上面的代码并没有 按预期进行。 是什么原因导致这种行为的?我该如何检查? 问题答案: 通

  • 为什么我在下面的代码段中的X轴上有一个溢出? 在我的网格容器上应用时,就会产生溢出。 null null https://codepen.io/anon/pen/wdjexz?editors=1100