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

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

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

注意:此答案的第一部分是我对另一个问题的回答的直接改编,该问题是在重新打开此问题之前回答的。我将对“问题”进行扩展;为什么;第二部分

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

事实上,它们根本不是功能。我将用loc举例,iloc是类似的(它使用不同的内部类)。
检查loc的最简单方法是:

将熊猫作为pd导入
df=pd.DataFrame()
打印(测向位置等级)

哪张照片

<类“pandas.core.index.\u LocIndexer”>

这告诉我们,df.loc\u LocIndexer类的一个实例。语法loc[]源于这样一个事实,即\u LocIndexer定义了\uuu getitem\uuuuuuuu\uuuuuuu setitem\uuuuuuu*,每当使用方括号语法时,python都会调用这些方法

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

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


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

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

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

#人为的例子表明这是行不通的
a=[]
def():
全球a
归还
附加(1)#好的
f()=dict()#语法错误:无法分配给函数调用

使用圆括号表示“a”;功能“;call,调用底层的\uu call方法(请注意,任何定义\uu call的类都是可调用的,因此“function”call是一个不正确的术语,因为python不关心某个是一个函数还是其行为类似于一个函数)

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

#基于虚拟方法的方括号表示法替代方法:
my_data=df.get_loc(my_索引)
df.set_loc(我的索引,我的数据*2)

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

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

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

发表评论