通过设置__

2024-09-30 01:23:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建DataFrame的一个子类,用很少的属性和方法扩展它。除了默认的构造函数之外,很少有像下面这样的构造函数从SQL表初始化DataFrame,然后添加几个属性(我简化了它,并留下了一个虚拟的来演示问题)。因此,一旦我得到了初始的df,我就通过df.__class__ = Cls语句将其“转换”为我的类。这对我来说似乎有点奇怪,但是阅读了一些关于这个问题的帖子(例如Reclassing an instance in Python),这是一个有效的方法,并且似乎大部分时间都有效。但问题是当我使用父类的方法时(在这种情况下数据帧.append)返回对象的新实例:sdf2 = sdf1.append(item)-sdf2的结果类是DataFrame而不是SubDataFrame,因此print('sdf2: ', sdf2.name)失败,因为“DataFrame”没有属性“name”。。。底线是,天真地尝试使用一个标准的数据帧方法,我的对象被破坏了。。。我可以通过在我的子类中编写(虚拟的)“append”方法来解决这个问题,但是在这种情况下,我需要对许多方法都这样做,如果我不能使用继承的方法,那么在子类化中就没有任何意义(我可以将DataFrame定义为类的一个成员变量)。 我想应该有这种分类的最佳实践,只是不知道。非常感谢任何帮助。 谢谢!在

阿迪

import pandas as pd
import pandas.io.sql as pdsql

class SubDataFrame(pd.DataFrame):

    @classmethod
    def create(Cls):

        # df = pdsql.read_sql(db_query, db_connection)
        d = {'one' : [1., 2., 3., 4.], 'two' : [4., 3., 2., 1.]}
        df = pd.DataFrame(d, index=['a', 'b', 'c', 'd'])
        df.__class__ = Cls
        df.name = 'Test Obj'
        return df


if __name__ == "__main__":

    sdf1 = SubDataFrame.create()
    print('sdf1: ', sdf1.__class__)   # prints sdf1:  <class '__main__.SubDataFrame'>"
    print('sdf1: ', sdf1.name)        # prints "sdf1:  Test Obj"

    item = sdf1.iloc[0].copy()
    sdf2 = sdf1.append(item)
    print('sdf2: ', sdf2.__class__)   # prints: "sdf2:  <class 'pandas.core.frame.DataFrame'>"
    print('sdf2: ', sdf2.name)  # exception: "AttributeError: 'DataFrame' object has no attribute 'name'"
    pass

尝试使用@BrenB建议的super()进行测试。我读了参考资料(关于未绑定的超类classmethod),但仍然无法使其工作。。。以下是我的测试:

^{pr2}$

注意,对于我的SubDataFrame,我有一个默认的__init__构造函数,create()是我的(非默认)构造函数,它是一个类方法,而在它内部我调用pandas.DataFrame(),它是标准绑定构造函数,需要self而不是Cls。所以我试了两种选择:

a.df = super(SubDataFrame, Cls).__init__(d, index=['a', 'b', 'c', 'd'])在文件“C:\Python34\lib\site packages\pandas\core”中生成错误AttributeError\帧.py,第208行:“dict”对象没有属性“_init_dict”

b.使用标准绑定构造函数__init__不会生成任何错误,但df返回为None(from df = super(SubDataFrame, self).__init__(d, index=['a', 'b', 'c', 'd'])

我是否错误地使用了super()?是熊猫虫吗?还有别的主意吗? 谢谢!在


Tags: 方法namedataframepandasdf属性initclass

热门问题