2012-11-05 46 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