2017-07-28 6 views
4

私はpandas DataFrameからクラスを作成しようとしています。私はDataFrameクラスに属性 'name'を追加したいだけです。しかし、以下のコードは再帰最大深度に達したときにエラーを生成します。どのように動作させるには?おかげ既存のクラスからクラスを構築する

import pandas as pd 
class DatFrame(pd.DataFrame): 
    def __init__(self, name, data=None, index=None, columns=None, 
       dtype=None, copy=False): 
     self.name = name 
     pd.DataFrame.__init__(self, data=None, index=None, 
           columns=None, dtype=None, copy=False) 


x = array([[9, 7, 5], 
      [7, 3, 1], 
      [8, 8, 3], 
      [7, 4, 3]]) 
cols = ['a', 'b', 'c'] 
index = ['D', 'E', 'F', 'G'] 

s = DatFrame('huy', x, index, cols) 

エラー:RecursionError:、あなたのデータフレーム

第二に、それが呼び出すことです修正のすべてのパラメータにNoneを渡している

+5

を、あなたは動的にすることができますPythonオブジェクトに属性を追加します。だから、変数 'df'で参照される' pd.DataFrame'があるとしましょう。 'df.name = 'huy''を実行するだけです。 –

+0

また、' pandas'データ構造をサブクラス化する際には特別な配慮が必要です。 [docs](http://pandas.pydata.org/pandas-docs/stable/internals.html#subclassing-pandas-data-structures)を参照してください –

答えて

5

まずPythonオブジェクトを呼び出している間、最大の再帰の深さを超え最初に__init__メソッドを設定してから、nameを設定してください。

それはpd.DataFrameオブジェクトを初期化するとき(再帰が__getattr__に発生する)空の変数辞書を期待して、あなたのnameメンバーがそれを混乱させるために、おそらくです:一般的なルールとして

class DatFrame(pd.DataFrame): 
    def __init__(self, name, data=None, index=None, columns=None, 
       dtype=None, copy=False): 
     pd.DataFrame.__init__(self, data=data, index=index, 
           columns=columns, dtype=dtype, copy=copy) 
     self.name = name 

、それが親を呼ぶことは常に良いでしょうコンストラクタの最初のもの、を次にあなたの詳細を設定します。

あなたが動的に属性を追加するファクトリメソッド、継承する必要はありません作成することができ、それが唯一の(メソッドを追加せずに)nameを追加するかどうコメントは、言ったように:だけ知っているので

def create_datframe(name,*args,**kwargs): 
    r = pd.DataFrame(*args,**kwargs) 
    r.name = name 
    return r 
+2

ええ、私はあなたが追加するときにサブクラス化のメリットを見ることができますこの場合、 'pd.Dataframe'をサブクラス化することは自明ではないので、私は単に動的属性を使うかもしれません。そして、間違いなく、再帰エラーのスタックトレースを見ると、データフレームの属性として名前で列にアクセスできるので、プロパティと名前でいくつかの魔法が行われます。空でない '__dict__'を持つことで、複雑な初期化が行われている間も確実に混乱することがあります。 –

+0

@ juanpa.arrivillaga AFAIKをサブクラス化して属性を追加したり、属性を動的に追加したりするのと同じ効果があります。クラス '__dict__'は(外部的にまたは' __init__'の中で)更新されるので、それが最初に構築された方法を除いて変更されません。 –

関連する問題