Массив Dask из фрейма данных

есть ли способ легко преобразовать фрейм данных числовых значений в массив? Похожие на values с фреймом данных pandas. Я не могу найти способ сделать это с помощью предоставленного API, но я бы предположил, что это обычная операция.

2 ответов


Edit: да, теперь это тривиально

можно использовать .values свойства

x = df.values

старше, теперь неправильный ответ

на данный момент нет тривиального способа сделать это. Это потому, что ДАСК.array должен знать длину всех своих кусков и dask.dataframe не знает этой длины. Это не может быть полностью ленивой операцией.

Это, как говорится, вы можете сделать это с помощью ДАСК.задержано as следует:

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)

кроме того, если вы хотите преобразовать DaskDataframe с N столбцами, и, следовательно, каждый элемент массива будет другим массивом, как это:

массив((x,x2,x3),(y1,y2,y3),....)

вы должны изменить порядок:

from:

i.compute().dtype 

to

i.compute().dtypes

спасибо