我想屬性添加到數據幀的一個子類,但我得到一個錯誤:如何將屬性添加到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__' ... –