来自 DataFrame 的 Dask 数组

Dask Array from DataFrame

有没有一种方法可以轻松地将数值的DataFrame转换为数组?类似于 values 和 pandas DataFrame。我似乎找不到使用提供的 API 执行此操作的任何方法,但我认为这是一个常见的操作。

编辑:是的,现在这是微不足道的

您可以使用 .values 属性

x = df.values

旧的,现在不正确的答案

目前没有简单的方法可以做到这一点。这是因为 dask.array 需要知道它所有块的长度,而 dask.dataframe 不知道这个长度。这不可能是一个完全偷懒的操作。

也就是说,您可以使用 dask.delayed 完成它,如下所示:

import dask.array as da
from dask import compute

def to_dask_array(df):
    partitions = df.to_delayed()
    shapes = [part.values.shape for part in partitions]
    dtype = partitions[0].dtype

    results = compute(dtype, *shapes)  # trigger computation to find shape
    dtype, shapes = results[0], results[1:]

    chunks = [da.from_delayed(part.values, shape, dtype) 
              for part, shape in zip(partitions, shapes)]
    return da.concatenate(chunks, axis=0)

我想,可能还有更短的方法。

import dask.array as da
import dask.dataframe as df

ruta ='...'
df = dd.read_csv(...)
x = df_reg['column you want to transform in array']

def transf(x):
    xd=x.to_delayed()
    full = [da.from_delayed(i, i.compute().shape, i.compute().dtype) for i in xd]
    return da.concatenate(full)

x_array=transf(x)

此外,如果你想转换一个有N列的DaskDataframe,因此,每个数组元素将是另一个数组,如下所示:

数组((x,x2,x3),(y1,y2,y3),....)

您必须更改顺序:

来自:

i.compute().dtype 

i.compute().dtypes

谢谢

Dask 现在有一个 DataFrame.to_dask_array() 函数来执行此操作。

文档:https://docs.dask.org/en/stable/generated/dask.dataframe.DataFrame.to_dask_array.html#dask.dataframe.DataFrame.to_dask_array