如何在自定义类对象上使用熊猫的.loc方法?

时间:2018-11-12 19:20:45

标签: python pandas class object indexing

我已经遍历了熊猫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 :(得分:9)

loc属性是几个索引器之一,请参见pandas.core.indexing module,特别是get_indexers_list() function

# the supported indexers
def get_indexers_list():


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

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

该函数is used to add attributes to the NDFrame class,它是pandas.DataFrame的基类。 get_indexers_list()结果中的每个类都是added as a property object

因此,要重新使用对象类型,可以添加属性,必要时使用相同的代码;向您的班级添加相同的班级方法

@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()委托给{{3}}这些委托的方法,至少需要访问 .axes.ndim ._get_value()._get_axis_name()._get_axis_number(),{{1 }},._get_axis()._reindex_with_indexers()属性和方法在数据框中。