子类化pd.DataFrame类导致试图显示数据时对象没有属性'_data'

问题描述 投票:0回答:1

我正在尝试创建(非常简单的)pandas子类,就像这样:

import pandas as pd

data = pd.DataFrame({'A': [1, 2], 'B': [2, 3], 'C': [4, 5]})

class TestFrame(pd.DataFrame):
    # See https://pandas.pydata.org/pandas-docs/stable/development/extending.html#extending-extension-types
    _metadata = pd.DataFrame._metadata + ["addnl"]

    @property
    def _constructor(self):
        return TestFrame

    @property
    def _constructor_sliced(self):
        return pd.Series

    @classmethod
    def plus_one(
        cls,
        df,
    ):
        tf = super().__new__(cls, df)
        tf.addnl = 1
        return tf

t1 = TestFrame.plus_one(data)

进行此操作没有错误,只是尝试查看t1给了我AttributeError: 'TestFrame' object has no attribute '_data'

我认为这是因为我正在调用DataFrame.__new__而不是__init__,因为它为此提供了相同的错误:

object.__new__(pd.DataFrame, {'A': [1, 2], 'B': [2, 3], 'C': [4, 5]})

但是,我无法找到定义构造函数的方法。由于熊猫子类化基础架构尚未(据我所知)尚未让您定义具有新属性的__init__,这使问题变得更加棘手。

非常感谢任何帮助。

我正在尝试创建一个(非常简单的)熊猫子类,就像这样:将熊猫作为pd数据= pd.DataFrame({'A':[1,2],'B':[2,3],' C':[4,5]})类TestFrame(pd.DataFrame):#参见https:// ...

python pandas subclass
1个回答
1
投票

这里的问题是tf = super().__new__(cls, df)行没有意义。如果要实例化TestFrame类型的帧,则可以使用tf = cls(df)

© www.soinside.com 2019 - 2024. All rights reserved.