我正在将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
修改。谢谢。
答案 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.DataFrame
和NDFrame
方法中被考虑,并设置为对象属性而不会引发 UserWarning 。
尽管_metadata
是普通属性,但也可以按照pandas documentation中所述用_internal_names
设置临时属性。修改数据框后不会保留临时属性。