我希望扩展Panda的DataFrame,创建一个所有原始DataFrame属性/方法都完好无损的对象,同时提供一些新的属性/方法。我还需要能够将已经是DataFrames的对象转换(或复制)到我的新类中。我的工作似乎可行,但是我觉得自己可能违反了一些基本约定。这是执行此操作的正确方法,还是我应该首先执行此操作?
import pandas as pd
class DataFrame(pd.DataFrame):
def __init__(self, df):
df.__class__ = DataFrame # effectively 'cast' Pandas DataFrame as my own
然后我可以直接从Pandas DataFrame初始化它的想法,例如:
df = DataFrame(pd.read_csv(path))
答案 0 :(得分:1)
如果您只想在DataFrame
上添加方法,请先运行猴子补丁,然后再执行以下任何操作。
>>> import pandas
>>> def foo(self, x):
... return x
...
>>> foo
<function foo at 0x00000000009FCC80>
>>> pandas.DataFrame.foo = foo
>>> bar = pandas.DataFrame()
>>> bar
Empty DataFrame
Columns: []
Index: []
>>> bar.foo(5)
5
>>>
答案 1 :(得分:1)
如果必须的话,我可能会这样做:
import pandas as pd
class CustomDataFrame(pd.DataFrame):
@classmethod
def convert_dataframe(cls, df):
df.__class__ = cls
return df
def foo(self):
return "Works"
df = pd.DataFrame([1,2,3])
print(df)
#print(df.foo()) # Will throw, since .foo() is not defined on pd.DataFrame
cdf = CustomDataFrame.convert_dataframe(df)
print(cdf)
print(cdf.foo()) # "Works"
注意:这将永久更改您传递给convert_dataframe
的df对象:
print(type(df)) # <class '__main__.CustomDataFrame'>
print(type(cdf)) # <class '__main__.CustomDataFrame'>
如果您不想这样做,可以将数据框复制到类方法中。
答案 2 :(得分:0)
if __name__ == '__main__':
app = DataFrame()
app()
事件
super(DataFrame,self).__init__()