尝试显示数据时,Subclassing pd.DataFrame class 导致“对象没有属性‘_data’”

Subclassing pd.DataFrame class results in `object has no attribute '_data'` when trying to display the data

我正在尝试创建一个(非常简单的)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]})

但是,我找不到定义构造函数的方法。由于 pandas 子类化基础结构还没有(据我所知)允许您定义具有新属性的 __init__,这使问题变得更加严重。

非常感谢任何帮助。

这里的问题是 tf = super().__new__(cls, df) 行没有意义。您没有覆盖 DataFrame.__init____new__,因此您不必使用 super() 来调用它们。

如果想要实例化TestFrame类型的框架,可以使用tf = cls(df)

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

    return tf