为什么iloc使用[]而不使用()?

时间:2019-09-30 11:20:53

标签: python pandas

我对python来说还比较陌生,在我看来(可能是因为我不明白),有时语法有些不一致。

假设我们正在使用pandas软件包fedcba ihg 。然后,import pandas as pdpd.method可以访问此包中的任何方法。现在,pandas程序包中的某些对象具有某些方法,即pd.DataFrame(...)(注意圆括号),或某些属性,即df.reindex()(注意无括号)。

我的问题有两个:

首先,我上面所说的正确吗?

第二,为什么df.columns方法不能保持上述语法?如果这是一种方法,那么我肯定应该使用iloc而不是df.iloc(0,0)来获取数据帧的左上值...

谢谢

2 个答案:

答案 0 :(得分:4)

TEMPLATES = [{ 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [ os.path.join(PROJECT_ROOT, 'site1-templates'), os.path.join(PROJECT_ROOT, 'base-templates'), ], 'OPTIONS': { # etc } }] 这里是python模块

import pandas as pd,如果您注意对流命名pd.DataFrame(...)是此处的课程。

DataFrame是一种在实例本身上调用的方法。

df.reindex()没有括号,因为它是对象的属性而不是方法

df.columns用于按 index 获取项目,因此在这里显示df.iloc的可索引性质更有意义。

答案 1 :(得分:2)

是的,从概念上讲您是正确的,如果它是可调用的,则无论是否可切片,都应使用()而不是[]进行调用。而这正是幕后发生的事情。一个例子是:

>>> lst = [1,2,3,4]
# slicing:
>>> lst[1:3]
... [2, 3]
# calling magic __getitem__ :
>>> lst.__getitem__(slice(1,3))
... [2, 3]

因此,在幕后,对任何可切片对象进行切片都可以使用这种dunder-getitem方法或类似方法。但是,这个__概念在OOP中传统上是指protected,强烈建议您不要直接调用它们,因此我们看不到方法调用本身,而是看到了{{ 1}}。同样,这些[...]方法或dunder在日常编程中会非常麻烦,而不是像magic或简单的[...](也就是{{1} }(+)的键入,直观和与框架其余部分的融合非常容易。因此,magic__add__一起使用,而不是方法调用。

如果有时间,我想请您参考.iloc上的熊猫源代码,尝试查找[...]https://github.com/pandas-dev/pandas/blob/master/pandas/core/indexing.py