2016-07-19 7 views
1

Ich versuche, eine Klasse zu erstellen, die ein Wrapper um pandas.DataFrame Objekte ist. Nachdem ich meine eigenen Methoden für diese Klasse geschrieben habe, möchte ich, dass die Methoden der Pandas auch verfügbar sind, aber auf eine Weise, die mir/dem Benutzer ausdrücklich sagt, dass sie Pandas sind. Es wäreErstellen eines Pandas.DataFrame-Wrappers mit einer Methode zum Zurückgeben eines Datenrahmens

df = pd.DataFrame(np.random.randn(5,2)) 
md = myData(df) 

a = md.df # returns the original pandas.DataFrame "df" to a (equivalent of a=df 
print(md) # prints as myData class 
print(md.df) # prints just as print(df) would. Equiv to print(df) 

md.mean() # mean as defined in myData class. Returns myData object 
md.df.mean() # mean as defined in pandas. Returns dataframe object 

md.std() # myData std 
md.df.std() # pandas std 

wie diese Arbeit bisher alles, was ich konnte erfolglose Versuche machen würden. Eine Sache, die ich wirklich dachte, es sollte aber nicht heißt

import pandas as _pd 
class myData(_pd.DataFrame): 
    """ 
    Attempt to create a myData object 
    """ 
    def __init__(self, df, dic): 
     df = df.copy() 
     print(type(df)) 
     self.df = df 
     self = df 

Es mit RuntimeError: maximum recursion depth exceeded while calling a Python object austritt.

EDIT

Der folgende Code endet mit dem gleichen Fehler.

import pandas as _pd 
class myData(_pd.DataFrame): 
    """ 
    Attempt to create a myData object 
    """ 
    def __init__(self, df, dic): 
     df = df.copy() 
     self.dic = dic 
     super(myData, self).__init__(df) 
     self.df = df 

Wenn ich jedoch

def __init__(self, df, dic): 
     df = df.copy() 
     super(myData, self).__init__(df) 

versuchen Dann funktioniert es, aber das Ergebnis ist ein myData Objekt, das wirklich ein Datenrahmen ist, da jede Methode ist bereits, dass der Datenrahmen.

Irgendeine Idee, was mit dem Code falsch sein könnte oder ob es eine Möglichkeit gibt, das besser zu machen?

+0

Sie können die übergeordneten Klasse zugreifen Attribute und Methoden mit 'super()' wie in [diese Frage] (http diskutiert: //stackoverflow.com/q/576169/3991125). – albert

+0

@albert danke für deinen Tipp. Bitte sehen Sie meine Bearbeitung – TomCho

Antwort

0

Sie nicht DataFrame als Mutter verwenden können:

class myData(object): 
    """ 
    Attempt to create a myData object 
    """ 
    def __init__(self, df): 
     self.df = df.copy() 

df = pd.DataFrame(np.random.randn(100, 5), columns=list('ABCDE')) 
mdf = myData(df) 
mdf.df.describe() 

enter image description here

Verwandte Themen