在继承DataFrame时,如何为' loc'编写包装器方法。

时间:2016-01-12 16:27:04

标签: python pandas subclass

我试图为DataFrame

的子类编写包装器方法
class SubDataFrame(DataFrame):
   ...

a = SubDataFrame()
b = a.loc[row, column]

在最后一行中,我希望在处理超类中的SubDataFrame之前或之后,在类loc中单独处理元数据。

我不知道如何实现这种表示法,因为如果我只是定义

def loc(self, *args, **kwargs)
SubDataFrame loc[]括号表示法中的

方法无法正常工作。 (AttributeError: instancemethod has no attribute getitem)。

我找不到关于如何实现这一点的文档。

1 个答案:

答案 0 :(得分:4)

不幸的是,Pandas实现索引的方式并不简单。

通常,为了对对象使用索引访问(例如obj[something]),需要使用__getitem____setitem__方法(请参阅here和{ {3}})。

对于DataFrameloc属性不是方法,而是委托索引的对象:

>>> frame = pd.DataFrame()
>>> type(frame.loc)
pandas.core.indexing._LocIndexer

您可以看到课程定义here。在这种情况下,_LocIndexer从({3}}继承(最终),它定义了索引访问所需的__getitem____setitem__方法。

如果要拦截子类中.loc[]的访问权限,则可能必须定义某种代理类,该代理类在传递给原始实现之前实现所需的行为。我怀疑这将是困难且容易出错的。