1 回答
TA贡献1780条经验 获得超1个赞
你在评论区说I've read that。但是,你没有。这就是问题的根源。由于that描述了对 pandas 数据框进行子类化的步骤,包括定义原始属性的方法。
考虑对您的代码进行以下修改。关键部分是_metadata。我从thing类中删除了所有属性,因为它们夸大了原始属性名称的数量 - 它们都必须添加到_metadata. 我还添加__repr__了修复另一个RecursionError. 最后,我删除directory了属性,因为它给了我TypeError.
import pandas as pd
class thing(object):
def __init__(self, item_location, name):
self.name = name
self.file = item_location
def __repr__(self):
return 'dummy_repr'
class custom_dataframe(thing, pd.DataFrame):
_metadata = ['name', 'file', 'directory']
def __init__(self, *args, **kwargs):
super(custom_dataframe, self).__init__(*args, **kwargs)
@property
def _constructor(self):
return custom_dataframe
if __name__ == '__main__':
cd = custom_dataframe('/foobar/foobar/foobar.html', 'name')
编辑。有点增强的版本 - 实施很差。
import pandas as pd
class thing:
_metadata = ['name', 'file']
def __init__(self, item_location, name):
self.name = name
self.file = item_location
class custom_dataframe(thing, pd.DataFrame):
def __init__(self, *args, **kwargs):
item_location = kwargs.pop('item_location', None)
name = kwargs.pop('name', None)
thing.__init__(self, item_location, name)
pd.DataFrame.__init__(self, *args, **kwargs)
@property
def _constructor(self):
return custom_dataframe
if __name__ == '__main__':
cd = custom_dataframe(
{1: [1, 2, 3], 2: [1, 2, 3]},
item_location='/foobar/foobar/foobar.html',
name='name')
添加回答
举报