我想属性添加到数据帧的一个子类,但我得到一个错误:如何将属性添加到pandas.DataFrame的子类?
>>> import pandas as pd
>>>class Foo(pd.DataFrame):
... def __init__(self):
... self.bar=None
...
>>> Foo()
RuntimeError: maximum recursion depth exceeded
我想属性添加到数据帧的一个子类,但我得到一个错误:如何将属性添加到pandas.DataFrame的子类?
>>> import pandas as pd
>>>class Foo(pd.DataFrame):
... def __init__(self):
... self.bar=None
...
>>> Foo()
RuntimeError: maximum recursion depth exceeded
你想写这个如下:
class Foo(pd.DataFrame):
def __init__(self):
super(Foo, self).__init__()
self.bar = None
就像一个指针:这个解决方案会让你陷入麻烦酸洗Foo,因为你设置self.bar = None你实际设置一个熊猫属性和熊猫属性不会被腌制。所以基本上你会放弃Foo的所有附加属性。 – SlimJim
有一个关于该问题的github问题:https://github.com/pydata/pandas/issues/2485。 DataFrame的“正确”子类目前还不支持,请参阅[这个长期存在的问题](https://github.com/pydata/pandas/issues/60),但正在取得进展。 –
仅供参考,我们为DataFrame创建了一个可选子类,它具有自定义属性元数据:https://github.com/Jim-Holmstroem/MetadataDataFrame。 另一个丑陋的可能性是使用DataFrame.name作为属性,因为这是唯一的'元数据'在数据框中被腌制。 – SlimJim
In [12]: class Foo(pd.DataFrame):
....: def __init__(self, bar=None):
....: super(Foo, self).__init__()
....: self.bar = bar
导致: -
In [30]: my_special_dataframe = Foo(bar=1)
In [31]: my_special_dataframe.bar
Out[31]: 1
In [32]: my_special_dataframe2 = Foo()
In [33]: my_special_dataframe2.bar
虽然低于解决它,从这个问题导致的** **的原因还有一个最大递归深度例外,有事做有趣的事情使用'DataFrame .__ getattr__' ... –