python - Pandas 对象的子类与其他对象的子类工作方式不同?

标签 python subclass pandas series

我正在尝试创建 Pandas 数据结构的子类,以在我的代码中替换 dict 的子类 Series 的子类,我不明白为什么这个示例代码不起作用

from pandas import Series    

class Support(Series):
    def supportMethod1(self):
        print 'I am support method 1'       
    def supportMethod2(self):
        print 'I am support method 2'

class Compute(object):
    supp=None        
    def test(self):
        self.supp()  

class Config(object):
    supp=None        
    @classmethod
    def initializeConfig(cls):
        cls.supp=Support()
    @classmethod
    def setConfig1(cls):
        Compute.supp=cls.supp.supportMethod1
    @classmethod
    def setConfig2(cls):
        Compute.supp=cls.supp.supportMethod2            

Config.initializeConfig()

Config.setConfig1()    
c1=Compute()
c1.test()

Config.setConfig2()    
c1.test()

可能这不是更改某些对象配置的最佳方法,无论如何我发现这在我的代码中很有用,最重要的是我想了解为什么使用 dict 而不是 series 它按我的预期工作。

非常感谢!

最佳答案

当前答案( Pandas >= 0.13)

Pandas 0.13 中的内部重构大大简化了子类化。 Pandas Series 现在可以像任何其他 Python 对象一样被子类化:

class MySeries(pd.Series):
    def my_method(self):
        return "my_method"

遗留答案(Pandas <= 0.12)

问题在于 Series 使用 __new__ 确保实例化 Series 对象。

你可以像这样修改你的类:

class Support(pd.Series):
    def __new__(cls, *args, **kwargs):
        arr = Series.__new__(cls, *args, **kwargs)
        return arr.view(Support)

    def supportMethod1(self):
        print 'I am support method 1'       
    def supportMethod2(self):
        print 'I am support method 2'

但是,最好是做一个 has-a 而不是一个 is-a。或者猴子修补 Series 对象。原因是由于数据存储的性质,您在使用 pandas 时经常会丢失子类。像

这样简单的东西
s.ix[:5] 
s.cumsum()

将返回一个 Series 对象而不是您的子类。在内部,数据存储在连续数组中并针对速度进行了优化。数据仅在需要时与类一起装箱,并且这些类是硬编码的。另外,如果类似 s.ix[:5] 的东西应该返回相同的子类,这并不是很明显。这将取决于您的子类的语义以及附加到它的元数据。

http://nbviewer.ipython.org/3366583/subclassing%20pandas%20objects.ipynb有一些笔记。

关于python - Pandas 对象的子类与其他对象的子类工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11979194/

相关文章:

python - 有时只读属性

python - 如何按名称导入自定义python包

ios - 在不同的swift文件中将父类(super class)调用到子类中

ios - 是否存在与 Swift 的 fatalError 等效的 Objective-C?

java - 什么时候需要显式调用父类(super class)构造函数?

python - ipython pylab : print histogram from dictionary

python - 如何将小时 "column"添加到仅包含分钟和秒的日期时间系列

python - 如何修复在两列中查找相同日期并根据相同日期连接两个数据帧的行

python - 多个类别的出现顺序

python - 当我尝试使用 Python 中的字符串格式替换 Python 字符串中的值时出现错误