Почему Dask заполняет "foo" и 1 в моем Dataframe - PullRequest
0 голосов
/ 08 февраля 2019

Я прочитал около 15 CSV-файлов:

df = dd.read_csv("gs://project/*.csv", blocksize=25e6,
                 storage_options={'token': fs.session.credentials})

Затем я сохранил Dataframe (он использует 7,33 ГБ памяти):

df = df.persist()

Я установил новый индекс, потому чтоЯ хочу, чтобы моя группа в этом поле была максимально эффективной:

df = df.set_index('column_a').persist()

Теперь у меня 181 подразделение и 180 разделов.Чтобы проверить, как быстро работала моя группа, я попробовал пользовательскую функцию применения, которая просто печатает Dataframe группы:

grouped_by_index = df.groupby('column_a').apply(lambda n: print(n)).compute()

, которая печатала Dataframe с правильными столбцами, но значения были либо "1", "foo"или" Правда ".Пример:

column_b  column_c column_d  column_e  column_f  column_g  \
index                                                                   
a          foo           1      foo        1           1           1

Я также получаю предупреждение:

/ opt / conda / lib / python3.7 / site-packages / ipykernel_launcher.py: 1: UserWarning: meta не указано, выведено из частичных данных.Пожалуйста, укажите meta, если результат будет неожиданным.До: .apply (func) После: .apply (func, meta = {'x': 'f8', 'y': 'f8'}) для результата фрейма данных или: .apply (func, meta = ('x'), 'f8'))
для результата серии "" "Точка входа для запуска ядра IPython.

Что здесь происходит?

1 Ответ

0 голосов
/ 08 февраля 2019

Действительно, если вы прочитаете документы для apply, вы увидите, что meta= - это параметр, который вы можете передать, который сообщает Dask, как ожидать, что выходные данные операции будут выглядеть.Это необходимо, потому что apply может делать очень общие вещи.

Если вы не поставляете meta=, как в вашем случае, чем Dask попытается начать операцию с помощьюПример мини-фрейма данных, содержащего 1 для любых числовых столбцов и «foo» для текстовых, просто чтобы посмотреть, как будет выглядеть вывод.Поскольку в вашем apply вы печатаете (и фактически ничего не возвращаете), вы видите это начальное число.

Как следует из документации, вам всегда лучше предоставить meta=, когда это возможно, а затемможно избежать целого шага в этом процессе.

...