尝试显示数据时,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
我正在尝试创建一个(非常简单的)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