所以,.loc和.iloc不是您通常使用的函数。 它们以某种方式使用 [ 和 ] 来包围参数,使其可与普通数组索引进行比较。 但是,我从未在其他库中看到过这种用法(我能想到的可能只有numpy类似的东西,我忘记了),而且我不知道它在Python代码中是如何工作/定义的。
在这种情况下,括号是否只是一种语法糖,用于调用函数?如果是这样,那么如何使任意函数使用方括号而不是圆括号?否则,Pandas中它们的使用/定义有什么特殊之处?
所以,.loc和.iloc不是您通常使用的函数。 它们以某种方式使用 [ 和 ] 来包围参数,使其可与普通数组索引进行比较。 但是,我从未在其他库中看到过这种用法(我能想到的可能只有numpy类似的东西,我忘记了),而且我不知道它在Python代码中是如何工作/定义的。
在这种情况下,括号是否只是一种语法糖,用于调用函数?如果是这样,那么如何使任意函数使用方括号而不是圆括号?否则,Pandas中它们的使用/定义有什么特殊之处?
所以,.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在使用方括号语法时调用的方法。_LocationIndexer
定义了这些方法,我在这里稍微简化了一下
我进入了推测领域,因为我找不到任何明确谈论Pandas设计选择的文档,但是:我至少看到了选择方括号的两个重要原因。Pandas为什么在使用.loc和.iloc时要使用方括号?
# 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不关心某些东西是否是函数或者只是像函数一样的行为)。__setitem__
,否则调用__getitem__
)来替代调用__getitem__
或__setitem__
。没有办法通过函数调用来模仿这种行为,您需要使用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)
something = df['a']
df['b'] = 2*something
使用loc
时,您仍然尝试引用DataFrame中的某些项,因此最好使用相同的语法而不是要求用户使用一些getter和setter函数(我认为这也更符合Python风格,但这是一个模糊的概念,我宁愿避开它)。
:
进行切片可能是另一个原因。 - user202729__setitem__
和__getitem__
函数。
__getitem__
的一种语法糖。所有对象都可以在其类定义中实现此方法,然后随后使用方括号进行操作。 - Ted Petrou