pleas.DataFrame的子类的属性在pickle之后消失

时间:2012-11-06 11:55:10

标签: python class inheritance subclass pandas

我正在尝试将属性添加到pandas.DataFrame的子类中,它们会在酸洗和去除后消失:

import cPickle
import pandas as pd

class MyClass(pd.DataFrame):
    def __init__(self):
        super(MyClass, self).__init__()
        self.bar = 1

myc = MyClass()
with open('myc.pickle', 'wb')as myfile:
    cPickle.dump(myc,myfile)
with open('myc.pickle', 'rb')as myfile:
    b = cPickle.load(myfile)
print b.bar

输出:

Traceback (most recent call last):
File "test_df.py", line 14, in <module>
print b.bar
File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 1771, in __getattr__
(type(self).__name__, name))
AttributeError: 'MyClass' object has no attribute 'bar'

知道如何安全地添加属性吗?

2 个答案:

答案 0 :(得分:5)

这与子类化无关。 Pandas对象的属性不会序列化。

您可以阅读this thread进行讨论和解决方法。该主题再次在this other recent thread重新出现。

答案 1 :(得分:0)

你可以使用@property装饰器做类似的事情:

class MyClass(pd.DataFrame):
    def __init__(self, *args, **kwargs):
        super(MyClass, self).__init__(*args, **kwargs)
        self.foo = 1


    @property
    def bar(self):
        return 1
在酸洗后

MyClass.foo将不可用,但MyClass.bar将在那里(截至目前为止,只读)。