为了账号安全,请及时绑定邮箱和手机立即绑定

创建具有多重继承的数据框的子类

创建具有多重继承的数据框的子类

慕雪6442864 2022-06-07 16:59:38
我想对 pandas 数据框进行子类化,但数据框的子类也将从我自己的自定义类继承。我想这样做是因为我想创建多个子类数据框,以及其他将共享此基类的属性和方法的子类(不是数据框)。开始我的基类是class thing(object):   def __init__(self, item_location, name):      self.name = name      self.file = item_location      self.directory = os.path.join(*item_location.split(os.path.sep)[0:-1])   @property   def name(self):       return self._name   @name.setter   def name(self,val):       self._name = val   @property   def file(self):       return self._file   @file.setter   def file(self,val):       self._location = val   @property   def directory(self):      return self._directory   @directory.setter   def directory(self,val):      self._directory = val现在我的子类之一将从熊猫和事物继承class custom_dataframe(thing,pd.DataFrame):   def __init__(self, *args, **kwargs):      super(custom_dataframe,self).__init__(*args,**kwargs)   @property   def _constructor(self):      return custom_dataframe我只是尝试制作一个空白数据框,并且只给它命名文件位置custom_dataframe('/foobar/foobar/foobar.html','name')我得到一个错误(我无法将整个堆栈跟踪作为其发布在未连接到 Internet 的计算机上)File "<stdin>", line 1, in <module>File "<path to file with classes>", line x, in __init__  self.name = name<a bunch of stuff going through pandas library>File "<path to pandas generic.py>", line 4372, in __getattr__  return object.__getattribute__(self,name)RecursionError: maximum recursion depth exceeded while calling a Python object我正在使用熊猫 0.23.4编辑:改为item_location.split(os.pathsep)[0:-1]_*item_location.split(os.path.sep)[0:-1]
查看完整描述

1 回答

?
慕神8447489

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')


查看完整回答
反对 回复 2022-06-07
  • 1 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信