我的目标是创建一个行为与Pandas DataFrame相同的对象,但在其之上还具有一些我自己的方法。据我了解,一种方法是扩展类,我首先尝试这样做:
class CustomDF(pd.DataFrame):
def __init__(self, filename):
self = pd.read_csv(filename)
但是尝试查看该对象时出现错误,提示:'CustomDF' object has no attribute '_data'
。
我的第二次迭代是不继承该对象,而是将其作为DataFrame导入到对象属性之一中,并使方法变通,如下所示:
class CustomDF():
def __init__(self, filename):
self.df = pd.read_csv(filename)
def custom_method_1(self,a,b,...):
...
def custom_method_2(self,a,b,...):
...
这很好,除了对于所有自定义方法而言,我需要先访问self.df
属性才能对其执行任何操作,但我希望我的自定义数据框只是self
。
有没有办法做到这一点?还是这种方法不理想?
答案 0 :(得分:0)
第一个示例中的__init__
方法被覆盖。
使用super
,然后添加您的自定义代码
class CustomDF(pd.DataFrame):
def __init__(self, *args, **kw):
super(CustomDF, self).__init__(*args, **kw)
# Your code here
def custom_method_1(self,a,b,...):
...
答案 1 :(得分:0)
在这里我可能会使用装饰器模式。接受的this post答案将使您步入正轨。
我看到您的第一次迭代真的很酷,但是在我看来,您需要了解有关Pandas内部的很多知识,例如,这个1 2 4 5
属性需要以某种方式设置。
干杯。
答案 2 :(得分:0)
这是您要找的吗?
class CustomDF:
def __init__(self):
self.df = pd.read_csv(filename)
def custom_method_1(self, *args, **kwargs):
result_1 = do_custom_operations_on(self.df, *args, **kwargs)
return result_1
def custom_method_2(self, *args, **kwargs):
result_2 = do_custom_operations_on(self.df, *args, **kwargs)
return result_2
...
答案 3 :(得分:0)
在我的项目中,我做了类似的事情并使用了装饰器,就像 manu 建议的那样。装饰器 let updatedData = {};
const dataFromBd = {
'1M': {
name: 'anna'
},
'1Y': {},
'2Y': {},
'3M': {},
'3Y': {},
'4Y': {},
'5Y': {},
'6M': {},
'7Y': {},
'10Y': {},
'14D': {},
'15Y': {},
'>20Y': {}
};
for (let [key, value] of Object.entries(dataFromBd)) {
updatedData[key] = 'hello';
if (key === '10Y') break;
}
console.log('data', updatedData);
可能适合您,它基本上将方法 @property
转换为属性 .df()
。因此它只会在被特别调用时被读入。但这仅适用于类的实例。
.df