Dask - Как объединить Series в DataFrame с apply? - PullRequest
0 голосов
/ 05 марта 2019

Как вернуть несколько значений из функции, примененной к серии Dask?Я пытаюсь вернуть серию из каждой итерации dask.Series.apply, и конечный результат будет dask.DataFrame.

Следующий код говорит мне, что мета неверна.Однако версия для всех панд работает.Что здесь не так?

Обновление: Я думаю, что я неправильно указываю мета / схему.Как мне сделать это правильно?Теперь это работает, когда я отбрасываю мета-аргумент.Тем не менее, это вызывает предупреждение.Я хотел бы использовать dask «правильно».

import dask.dataframe as dd
import pandas as pd
import numpy as np
from sklearn import datasets

iris = datasets.load_iris()

def transformMyCol(x):
    #Minimal Example Function
    return(pd.Series(['Tom - ' + str(x),'Deskflip - ' + str(x / 8),'']))

#
## Pandas Version - Works as expected.
#
pandas_df = pd.DataFrame(data= np.c_[iris['data'], iris['target']], columns= iris['feature_names'] + ['target'])
pandas_df.target.apply(transformMyCol,1)

#
## Dask Version (second attempt) - Raises a warning
#
df = dd.from_pandas(pandas_df, npartitions=10)

unpacked = df.target.apply(transformMyCol)
unpacked.head()

#
## Dask Version (first attempt) - Raises an exception 
#
df = dd.from_pandas(pandas_df, npartitions=10)

unpacked_dask_schema = {"name" : str, "action" : str, "comments" : str}

unpacked = df.target.apply(transformMyCol, meta=unpacked_dask_schema)
unpacked.head()

Это ошибка, которую я получаю:

  File "/anaconda3/lib/python3.7/site-packages/dask/dataframe/core.py", line 3693, in apply_and_enforce
    raise ValueError("The columns in the computed data do not match"
ValueError: The columns in the computed data do not match the columns in the provided metadata

Я также верно и следующее, и это также не работает.

meta_df = pd.DataFrame(dtype='str',columns=list(unpacked_dask_schema.keys()))


unpacked = df.FILEDATA.apply(transformMyCol, meta=meta_df)
unpacked.head()

Та же ошибка:

  File "/anaconda3/lib/python3.7/site-packages/dask/dataframe/core.py", line 3693, in apply_and_enforce
    raise ValueError("The columns in the computed data do not match"
ValueError: The columns in the computed data do not match the columns in the provided metadata

1 Ответ

0 голосов
/ 07 марта 2019

Вы правы, проблема в том, что вы не указали мета правильно;более конкретно и, как говорится в сообщении об ошибке, столбцы метаданных ("name", "action", "comments") не соответствуют столбцам в вычисленных данных (0, 1, 2).Вы должны либо:

  1. Изменить столбцы метаданных на 0, 1, 2:
   unpacked_dask_schema = dict.fromkeys(range(3), str)
   df.target.apply(transformMyCol, meta=unpacked_dask_schema)

или

Измените transformMyCol на использование именованных столбцов:

    def transformMyCol(x):
        return pd.Series({
            'name': 'Tom - ' + str(x), 
            'action': 'Deskflip - ' + str(x / 8), 
            'comments': '',
        }))
...