DataFrame中的Dask数组

时间:2016-05-25 18:24:42

标签: dask

有没有办法轻松将数值的DataFrame转换为数组?与带有pandas DataFrame的values类似。我似乎无法使用提供的API找到任何方法,但我认为这是一个常见的操作。

2 个答案:

答案 0 :(得分:8)

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

您可以使用.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)

答案 1 :(得分:1)

我认为,可能会有另一种方式缩短。

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

由于