我已经遍历了熊猫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, :]
答案 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()
属性和方法在数据框中。