当子类化 DataFrame 时如何为“loc”编写包装方法

leo*_*lds 5 python subclass pandas

我正在尝试为 的子类编写一个包装方法DataFrame

class SubDataFrame(DataFrame):
   ...

a = SubDataFrame()
b = a.loc[row, column]
Run Code Online (Sandbox Code Playgroud)

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

我不知道如何实现这个符号,因为如果我只是定义

def loc(self, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

SubDataFrame括号中的方法loc[]不起作用。( AttributeError: instancemethod has no attribute getitem)。

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

Wil*_*den 5

不幸的是,Pandas 实现索引的方式一点也不简单。

一般来说,为了对对象使用索引访问(例如,obj[something]),它需要具有__getitem____setitem__方法(请参阅此处此处)。

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

>>> frame = pd.DataFrame()
>>> type(frame.loc)
pandas.core.indexing._LocIndexer
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看类定义。在本例中,_LocIndexer(最终)继承自,它定义了索引访问_NDFrameIndexer所需的条件__getitem__和方法。__setitem__

如果您想.loc[]在子类中拦截访问,您可能必须定义某种代理类来实现所需的行为,然后再传递给原始实现。不过,我怀疑这会很困难并且容易出错。