扩展Dask数据帧对象

2024-10-03 23:28:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我想扩展dask.dataframe dataframe对象并添加新的属性/方法,而不必重写大多数先前存在的dask函数

例如,如果我有一个类:

from dask.dataframe import DataFrame
class MyExtendedDataframe(DataFrame):
    def __init__(self, df):
        super(DataFrame, self).__init__(df.dask, df._name, df._meta, df.divisions)
        self.myAttribute = "Dog"
    def myMethod(self):
        return self.dropna()

我可以创建一个具有Dask DataFrame对象所有属性的对象实例(如下)

df = dd.read_csv('mydata.csv')
mydf = MyExtendedDataframe(df)
print(type(mydf))

打印:“MyExtendedDataframe”

然后我可以调用MyExtendedDataframe对象上的Pandas链接函数

mydf = mydf['field1', 'field2']]
print(type(mydf))

上面的打印:dask.dataframe.core.DataFrame显然属性MyAttribute和方法MyMethod不是结果实例的成员

换句话说,我希望我的新类拥有dask.dataframe.core.DataFrame类的所有属性,但是当我调用属于dask.dataframe.core.DataFrame的方法时,我希望它返回一个MyExtendedDataframe的实例,并完成给定的操作。例如:

mydf = mydf[['field1', 'field2']]
print(type(mydf))

应该打印“MyExtendedDataframe”和

print(mydf.myAttribute)

索引操作后应打印“Dog”


我知道我可以为所有默认的Dask方法创建一个包装器方法,它将重建并返回我的类的一个实例。但这似乎是一个麻烦,并要求我更新我的模块,如果Dask的变化。有没有更简单的方法来实现这种行为

另一个可能的解决方案是使我的dask.dataframe.core.DataFrame对象成为我的自定义类的属性,但这很笨拙,而且要访问和设置数据帧,我必须经常使用以下内容:

mydf.dataframe = mydf.dataframe[['field1', 'field2']]

Tags: 对象实例方法coreselfdataframedf属性