Как использовать метод `.loc` из панд на объекте пользовательского класса? - PullRequest
0 голосов
/ 12 ноября 2018

Я просматривал исходный код панд https://github.com/pandas-dev/pandas/blob/master/pandas/core/generic.py и не могу понять, где они на самом деле реализуют метод нарезки .loc.Я работаю над оберткой, которая принимает кучу pd.DataFrames.Ради этого вопроса, давайте назовем это DataFrameCollection.Я не хочу наследовать все методы, поэтому я не хочу делать class DataFrameCollection(pd.DataFrame): pass.

Кто-нибудь знает, какой код отвечает за .loc метод pd.DataFrameобъект и как это можно использовать для пользовательского объекта?

По сути, я хотел бы иметь возможность сделать следующее:

dfc_iris =  DataFrameCollection(" a bunch of dataframes")
dfc_iris.loc[idx_obsvs, :]

1 Ответ

0 голосов
/ 17 ноября 2018

Атрибут loc является одним из нескольких индексаторов, см. Модуль pandas.core.indexing , в частности функцию get_indexers_list() :

# the supported indexers
def get_indexers_list():


    return [
        ('ix', _IXIndexer),
        ('iloc', _iLocIndexer),
        ('loc', _LocIndexer),
        ('at', _AtIndexer),
        ('iat', _iAtIndexer),
    ]

Каждыйиз этих классов определяется в том же модуле.

Эта функция используется для добавления атрибутов в NDFrame class , который является базовым классом pandas.DataFrame.Каждый из классов в результате get_indexers_list() добавляется как property объект .

Таким образом, чтобы повторно использовать тип объекта, вы можете добавить свои свойства, используя тот же кодесли необходимо;добавьте тот же метод класса к вашему классу

@classmethod
def _create_indexer(cls, name, indexer):
    """Create an indexer like _name in the class."""
    if getattr(cls, name, None) is None:
        _indexer = functools.partial(indexer, name)
        setattr(cls, name, property(_indexer, doc=indexer.__doc__))

, затем добавьте индексаторы с

# install the indexes
for _name, _indexer in indexing.get_indexers_list():
    DataFrameCollection._create_indexer(_name, _indexer)

Учитывая dfcollection экземпляр вашего DataFrameCollection класса, тогда dfcollection.loc приведет кв _LocIndexer('loc', dfcollection) вызове и возврате.

Изучите оставшийся код в pandas.core.indexing, чтобы увидеть, как каждый индексатор ожидает найти информацию о вашем экземпляре DataFrameCollection;это ссылка self.obj в методах индексатора.

Например, dfcollection.loc[...] переводится в _LocationIndexer.__getitem__(), что делегирует _LocIndexer._is_scalar_access(), _LocIndexer._getitem_scalar(), _NDFrameIndexer._getitem_tuple() и _LocIndexer._getitem_axis(), которым вместе с методами, на которые эти делегаты делегированы, требуется доступ к , по крайней мере the .axes, .ndim ._get_value(), ._get_axis_name(), ._get_axis_number(), ._get_axis(), ._reindex_with_indexers() и ._take() атрибуты и методы в кадре данных.

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