Почему iloc использует [], а не ()? - PullRequest
2 голосов
/ 30 сентября 2019

Я относительно новичок в python, и мне кажется (вероятно, потому, что я не понимаю), что синтаксис иногда немного противоречив.

Предположим, мы работаем с пакетом pandas import pandas as pd. Тогда любой метод в этом пакете может быть доступен с помощью pd.method, то есть pd.DataFrame(...). Теперь в пакете pandas есть определенные объекты, которые имеют определенные методы, например df.reindex() (обратите внимание на круглые скобки) или определенные атрибуты, например df.columns (обратите внимание, нет скобок).

У меня вопрос в два раза:

Прежде всего, верно ли то, что я сказал выше?

Во-вторых, почему метод iloc не поддерживает вышеуказанный синтаксис? Если это метод, тогда, конечно, я должен использовать df.iloc(0,0) вместо df.iloc[0,0] для получения верхнего левого значения фрейма данных ...

Спасибо

Ответы [ 2 ]

3 голосов
/ 30 сентября 2019

import pandas as pd здесь это модуль python

pd.DataFrame(...), если вы обращаете внимание на конвекцию именования DataFrame - это класс здесь.

df.reindex() - это метод, вызываемый в экземпляресам по себе.

df.columns не имеет скобок, поскольку является атрибутом объекта, а не методом.

df.iloc предназначен для получения элемента по index , чтобы показатьэто индексируемая природа [] имеет больше смысла здесь.

2 голосов
/ 30 сентября 2019

Да, вы концептуально верны, если это вызываемый объект, он должен вызывать с () вместо [] независимо от того, является ли он срезанным или нет. И это именно то, что происходит под капотом. Примером может быть:

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

Таким образом, нарезка любого нарезанного объекта работает с помощью этого метода dunder-getitem или чего-то подобного. Однако эта концепция __, традиционно в ООП, означает protected, то есть вам настоятельно не рекомендуется вызывать их напрямую, поэтому мы видим не сам вызов метода, а какой-то псевдоним [...]. Кроме того, эти dunder методы или magic были бы очень громоздкими в повседневном программировании, вместо этого что-то вроде [...] или просто + (который также magic называется __add__) намного прощеТип, интуитивно понятный и хорошо сочетается с остальной частью структуры. Следовательно, .iloc используется с [...] вместо вызова метода.

Если у вас есть время, я хотел бы отослать вас к исходному коду панд по indexing, попробуйте найти _LocationIndexer: https://github.com/pandas-dev/pandas/blob/master/pandas/core/indexing.py

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...