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

熊猫为什么/如何将方括号与.loc和.iloc一起使用?

漆雕令秋
2023-03-14

因此.loc和.iloc不是典型的函数。它们以某种方式使用[和]来包围参数,使其与普通数组索引相当。然而,我从未在另一个库中看到过这种情况(我可以想到,可能numpy就是这样的东西,我不知道它在技术上是如何工作的/在python代码中是如何定义的)。

本例中的括号是否只是函数调用的语法糖?如果是这样,那么如何让任意函数使用括号而不是括号呢?否则,它们的使用/定义有什么特殊之处?

共有2个答案

章城
2023-03-14

在封盖下面,两者都在使用\uuuuuu setitem\uuuuuuuu\uuuuuuuu getitem\uuuuuuuu功能。

田鹤轩
2023-03-14

注:本答案的第一部分是我对另一个问题的回答的直接改编,该问题在本问题重新开始之前已得到回答。我将在第二部分详细介绍“为什么”。

因此.loc和.iloc不是典型的函数

的确,它们根本不是函数。我将用loc做例子,iloc是类似的(它使用不同的内部类)。检查loc实际上是什么的最简单方法是:

import pandas as pd
df = pd.DataFrame()
print(df.loc.__class__)

哪张照片

<class 'pandas.core.indexing._LocIndexer'>

这告诉我们df.loc_LocIndexer类的实例。语法loc[]来源于这样一个事实,即_LocIndexer定义了__getitem____setitem__*,这是python在使用方括号语法时调用的方法。

是的,从技术上讲,方括号是某些函数调用的语法糖,而不是您所认为的函数(当然,python是以这种方式设计的有很多原因,我在这里不详细介绍,因为1)我不是足够的专家,无法提供详尽的答案;2)关于这个话题,网络上有很多更好的资源)。

*从技术上讲,是它的基类\u LocationIndexer定义了这些方法,我在这里简化了一点

为什么熊猫会将方括号与.loc和.iloc一起使用?

我在这里进入了猜测领域,因为我找不到任何明确谈论熊猫设计选择的文档,然而:我认为选择方括号至少有两个很好的理由。

第一个也是最重要的原因是:在python中,分配给函数调用是一个语法错误,因此不能用方括号表示法处理函数调用:

# contrived example to show this can't work
a = []
def f():
  global a
  return a
f().append(1) # OK
f() = dict() # SyntaxError: cannot assign to function call

函数调用使用圆括号,调用基础的__call__方法(注意,任何定义__call__的类都是可调用的,所以函数调用是一个不正确的术语,因为python不在乎某个东西是否是函数或只是表现得像一个)。

相反,使用方括号,或者调用\uuuu getitem\uuuuuuuuuuuuuuuuuuuuu\uuuuuuu setitem\uuuuuuuuuuuuuuu,具体取决于调用发生的时间(\uuuuuuuuu setitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu如果它位于赋值运算符的左侧,则在任何其他情况下。无法通过函数调用模拟这种行为,您需要一个setter方法来修改数据帧中的数据,但在赋值操作中仍然不允许:

# imaginary method-based alternative to the square bracket notation:
my_data = df.get_loc(my_index)
df.set_loc(my_index, my_data*2)

这个例子让我想到第二个原因:一致性。您可以通过方括号访问DataFrame的元素:

something = df['a']
df['b'] = 2*something

当使用loc时,您仍然试图引用数据帧中的某些项,因此使用相同的语法而不是要求用户使用一些getter和setter函数更为一致(我认为这也是“更具pythonic性的”,但这是一个模糊的概念,我宁愿远离它)。

 类似资料:
  • 我来自C背景,最近开始学习python。我正在学习索引和选择数据。我遇到了在类,和在熊猫库。我不明白什么是?是功能还是属性?很多时候,我错误地使用而不是,并且没有得到实际的结果(但它不会给我带来错误)。 例子: 有谁能告诉我在哪里可以更多地研究这类运营商。

  • 参考这个答案,Lev说包括开始和停止索引,所以我尝试了这个: 但它们也不同。为什么啊? 有人能帮我吗?

  • 假设我有下面的数据框,我想将

  • 我有以下问题:在df中,我想要选择特定的行和特定的列,在这个选择中,获取第一个元素,并为它们分配一个新值。我天真地认为以下代码应该可以完成这项工作: 和都应将视图返回到df中,并且应覆盖该值。但是,数据帧不会改变。为什么? 我知道如何绕过它--首先使用创建一个新的df,然后使用更改值并更新原始df(如下所示)。 但是a)我不认为这是最佳的,b)我想知道为什么顶级解决方案不起作用。为什么它返回一个副

  • 我对pandas的iloc函数有点困惑,因为我想选择一系列列,并且输出与预期不同。行选择也会发生同样的情况,因此我编写了一个小示例: 我想选择第1行到第2行结果是我所期望的: 如果我这样做我会认为我得到了相同的结果,但是没有: 我有点困惑,因为我希望这两个函数的行为相同,但如果我选择一个范围(从:到),这两个函数的输出都会不同。 似乎使用iloc需要将TO值设为1,才能获得与loc: 有人能给它点

  • 所以我运行了一些示例: 类似于: 让我们使用和并确保得到相同的内容 这就是说,谁能提供关于方法可以做什么和不能做什么的指导呢?