2012-11-05 17 views
4

我想属性添加到数据帧的一个子类,但我得到一个错误:如何将属性添加到pandas.DataFrame的子类?

>>> import pandas as pd 
>>>class Foo(pd.DataFrame): 
...  def __init__(self): 
...   self.bar=None 
...   
>>> Foo() 


RuntimeError: maximum recursion depth exceeded 
+1

虽然低于解决它,从这个问题导致的** **的原因还有一个最大递归深度例外,有事做有趣的事情使用'DataFrame .__ getattr__' ... –

回答

2

你想写这个如下:

class Foo(pd.DataFrame): 
    def __init__(self): 
    super(Foo, self).__init__() 
    self.bar = None 

Python's __init__ syntax问题。

+1

就像一个指针:这个解决方案会让你陷入麻烦酸洗Foo,因为你设置self.bar = None你实际设置一个熊猫属性和熊猫属性不会被腌制。所以基本上你会放弃Foo的所有附加属性。 – SlimJim

+1

有一个关于该问题的github问题:https://github.com/pydata/pandas/issues/2485。 DataFrame的“正确”子类目前还不支持,请参阅[这个长期存在的问题](https://github.com/pydata/pandas/issues/60),但正在取得进展。 –

+0

仅供参考,我们为DataFrame创建了一个可选子类,它具有自定义属性元数据:https://github.com/Jim-Holmstroem/MetadataDataFrame。 另一个丑陋的可能性是使用DataFrame.name作为属性,因为这是唯一的'元数据'在数据框中被腌制。 – SlimJim

1
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