gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:09:17 26 4
gpt4 key购买 nike

所以 .loc 和 .iloc 不是您的典型函数。他们以某种方式使用 [ 和 ] 包围参数,使其与普通数组索引相当。但是,我从来没有在另一个库中看到过这个(我能想到的,也许 numpy 就像我正在空白的这样的东西),而且我不知道它在技术上是如何工作的/在 python 代码中是如何定义的。

这种情况下的方括号只是函数调用的语法糖吗?如果是这样,那么如何使任意函数使用方括号而不是圆括号呢?否则,它们的使用/定义 Pandas 有什么特别之处?

最佳答案

注意:此答案的第一部分是对my answer to this other question 的直接改编。 ,在重新打开此问题之前已回答。我在第二部分详细阐述了“为什么”。

So .loc and .iloc are not your typical functions

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

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

打印

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

这告诉我们 df.loc_LocIndexer 类的实例。语法 loc[] 源自 _LocIndexer defines __getitem__ and __setitem__* ,这是 python 在您使用方括号语法时调用的方法。

所以是的,从技术上讲,括号是一些函数调用的语法糖,只是不是你认为的函数(当然有很多原因为什么 python 是这样设计的,我不会'此处不详述,因为 1) 我不够专业,无法提供详尽的答案,以及 2) 网络上有很多关于此主题的更好资源)。

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


Why does Pandas use square brackets with .loc and .iloc?

我在这里进入猜测区域,因为我找不到任何明确讨论 Pandas 设计选择的文档,但是:我认为至少有两个很好的理由选择方括号。

第一个也是最重要的原因是:你不能简单地用一个函数调用来完成你用方括号表示法所做的一切,因为在 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 不关心某个东西是 函数还是只是表现得像一个函数)。

使用方括号代替调用 __getitem____setitem__ 取决于调用发生的时间(__setitem__ 如果它在赋值运算符,__getitem__ 在任何其他情况下)。无法通过函数调用来模拟此行为,您需要一个 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 时,您仍在尝试引用 DataFrame 中的某些项目,因此使用相同的语法而不是要求用户使用一些 getter 和 setter 函数(它是另外,我相信,“更像 pythonic”,但这是一个我宁愿远离的模糊概念)。

关于python - Pandas 为什么/如何将方括号与 .loc 和 .iloc 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46176656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com