【发布时间】:2018-08-07 10:13:22
【问题描述】:
我已经定义了 pandas Dataframe 的一个子类。子类与数据框基本相同,但有额外的方法来完成专门的任务。
pandas 数据框最方便的属性之一是支持方法链接;也就是说,数据框方法返回数据框类的实例。
我希望能够使用这些方法,但是当我从子类调用它们时,我得到了父类的一个实例。
import pandas as pd
class MySpecialDF(pd.DataFrame):
def sqrt(self, colname):
return self[colname]**2.0
df = MySpecialDF({'a':[1,2,3], 'b':[4,5,6]})
df.sqrt('a') # all good!
df = df.drop('b', axis=1) # returns a regular DF
df.sqrt('a') # AttributeError: 'DataFrame' object has no attribute 'sqrt'
如何设置这些方法以使这些方法返回 子类 的实例?
我可以像这样手动覆盖单个方法:
class MySpecialDF(pd.DataFrame):
def sqrt(self, colname):
return self[colname]**2.0
def drop(self, *args, **kwargs):
return MySpecialDF(super(MySpecialDF, self).drop(*args, **kwargs))
但是 Dataframes 有很多 个,我不想为每个手动执行此操作。
我认为可能有一种方法可以应用一些装饰器来包装每个父方法,但我不确定如何执行此操作或者它是否是正确的方法。
这个问题对于子类继承返回父类实例的方法的所有情况都很普遍。
有人知道如何解决这个问题吗?
【问题讨论】:
-
我对此没有太多经验,但看起来 piRSquared 在this answer 中涵盖了这个。
标签: python pandas class oop inheritance