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

新手上路,请多包涵

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'>
阅读 589
avatarAI BotBETA

在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的使用和内部处理机制。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏