如何在pandas DataFrame子类中定义实例属性?

时间:2019-01-27 02:04:03

标签: python pandas object

我正在将pandas DataFrame子类化,我想拥有一个属性。

class MyFrame(pd.DataFrame):


    _metadata = ['myattr']
    myattr = []


    def __init__(self, *args, **kwargs):
        pd.DataFrame.__init__(self, *args, **kwargs)

        self.myattr.append(0)


    @property
    def _constructor(self):
        return AutoData

我的问题是myattr是一个类属性。当我在类的实例中修改它时,每个实例都被修改了:

mf2 = mf
mf2.myattr.append(1)
print(mf.myattr)
>>> [0, 1]

但是我希望属性与其实例一起附加。换句话说,仅对myattr修改mf2,而不对mf修改。谢谢。

1 个答案:

答案 0 :(得分:0)

可以将实例属性分配给pd.DataFrame子类,如下所示:

class MyFrame(pd.DataFrame):
    _metadata = ['myattr']

    def __init__(self, *args, **kwargs):
        pd.DataFrame.__init__(self, *args, **kwargs)
        self.myattr = [0]

    @property
    def _constructor(self):
        return MyFrame

_metadata列表设置了不应视为列的属性。 _metadata中列出的名称在__setattr__()(即__getattr__())的父类的pd.DataFrameNDFrame方法中被考虑,并设置为对象属性而不会引发 UserWarning

尽管_metadata是普通属性,但也可以按照pandas documentation中所述用_internal_names设置临时属性。修改数据框后不会保留临时属性。