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'>
在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的行。.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