首页 > 解决方案 > 如何在自定义类对象上使用 pandas 的`.loc` 方法?

问题描述

我一直在浏览 pandas 的源代码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, :]

标签: pythonpandasclassobjectindexing

解决方案


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添加属性,该类是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实例,然后将导致被调用并返回。DataFrameCollectiondfcollection.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().axes.ndim ._get_value()._get_axis_name()._get_axis_number()._get_axis()._reindex_with_indexers()._take()


推荐阅读