【问题标题】:What is the difference between pandas' df.take() and df.iloc[]?pandas 的 df.take() 和 df.iloc[] 有什么区别?
【发布时间】:2020-09-26 20:43:04
【问题描述】:

对我来说,df.take() 似乎与更常见的df.iloc[] 具有相同的功能。我检查了文档,但找不到区别。是否存在take() 优于iloc[] 的情况?

【问题讨论】:

  • df.take 返回具有特定索引轴值的数据帧; iloc 可以返回带有行和列索引的数据帧。由于 df.take 的功能受到限制,因此通常速度更快。阅读take methods了解更多
  • 谢谢,说得通。
  • @sammywemmy 你确定 .take 通常更快吗?因为它总是复制数据,所以我认为它通常比较慢。你有这方面的参考吗?
  • 我认为 Pandas 中的很多操作都需要复制;但是 take 的参考范围更窄。这是熊猫文档中的reference

标签: pandas indexing


【解决方案1】:

案例: 我收到以下错误消息,最后发现它挂在 .iloc 上。

TypeError: unhashable type: 'list'

由于 iloc 返回一个可变列表,因此代码不会继续求和。从 .iloc 到 .take 的简单更改解决了这个问题。

#returns list
df3['sum_total']= df3.iloc[:,-30].sum(axis=[1])
#returns tuple and worked
df3['sum_total']= df3.take([-30], axis=1).sum(axis=1)

【讨论】:

    【解决方案2】:

    有一些非常重要的区别:

    1. .iloc 属于 类型,而 .take 是一种方法
    2. 最重要的 .iloc 可以同时索引到行和列。 .take 只能选择其中之一。
    3. .take 始终返回两个轴上具有相同级别数的 DataFrame。相比之下,.iloc 可以轻松返回更少的级别,以至于完全返回 Series 而不是 DataFrame,即 df.iloc[3, :] 返回以列为索引的 Series,但 df.take([3 ]) 返回一个只有一行的 DataFrame。
    4. 也很重要,.take 总是返回一个副本。这意味着您也可以使用 .iloc 进行分配,但 .take 并非如此。

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 2023-01-29
      • 1970-01-01
      • 2019-02-04
      • 2016-07-02
      • 2014-05-05
      • 2018-09-27
      • 2014-03-16
      • 2014-11-20
      相关资源
      最近更新 更多