因此.loc和.iloc不是典型的函数。它们以某种方式使用[和]来包围参数,使其与普通数组索引相当。然而,我从未在另一个库中看到过这种情况(我可以想到,可能numpy就是这样的东西,我不知道它在技术上是如何工作的/在python代码中是如何定义的)。
本例中的括号是否只是函数调用的语法糖?如果是这样,那么如何让任意函数使用括号而不是括号呢?否则,它们的使用/定义有什么特殊之处?
在封盖下面,两者都在使用\uuuuuu setitem\uuuuuuuu
和\uuuuuuuu getitem\uuuuuuuu
功能。
注:本答案的第一部分是我对另一个问题的回答的直接改编,该问题在本问题重新开始之前已得到回答。我将在第二部分详细介绍“为什么”。
因此.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: 有人能给它点
所以我运行了一些示例: 类似于: 让我们使用和并确保得到相同的内容 这就是说,谁能提供关于方法可以做什么和不能做什么的指导呢?