如何在自定义类对象上使用pandas中的`.loc`方法?

O.r*_*rka 0 python indexing class object pandas

我一直在浏览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, :]
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 9

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),
    ]
Run Code Online (Sandbox Code Playgroud)

每个类都在同一个模块中定义.

该函数用于向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__))
Run Code Online (Sandbox Code Playgroud)

然后添加索引器

# install the indexes
for _name, _indexer in indexing.get_indexers_list():
    DataFrameCollection._create_indexer(_name, _indexer)
Run Code Online (Sandbox Code Playgroud)

给定一个类的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(),与方法一起这些委托,需要访问至少所述.axes,.ndim ._get_value(),._get_axis_name(),._get_axis_number(),._get_axis(),._reindex_with_indexers()._take()属性以及在数据帧的方法.