我试图创建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()?是熊猫虫吗?还有别的主意吗? 谢谢!在
目前没有回答
相关问题 更多 >
编程相关推荐