我正在尝试创建(非常简单的)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:// ...
这里的问题是tf = super().__new__(cls, df)
行没有意义。您没有覆盖DataFrame.__init__
或__new__
,因此您不必使用super()
来调用它们。