Безопасный и эффективный способ изменения фрейма данных dask

В рамках рабочего процесса с данными мне нужно изменить значения в подмножестве столбцов фрейма данных dask и передать результаты для дальнейших вычислений. В частности, меня интересуют два случая: сопоставление столбцов и сопоставление разделов. Каков рекомендуемый безопасный и эффективный способ работы с данными? Я использую распределенную установку в кластере с несколькими рабочими процессами на каждом хосте.

Case1.

Я хочу бежать:

res = dataframe.column.map(func, ...)

это возвращает серию данных, поэтому я предполагаю, что исходный фрейм данных не изменен. Безопасно ли назначать столбец обратно в фрейм данных, например. dataframe['column']=res? Возможно нет. Следует ли мне сделать копию с помощью .copy (), а затем присвоить ей результат, например:

dataframe2 = dataframe.copy()
dataframe2['column'] = dataframe.column.map(func, ...)

Любой другой рекомендуемый способ сделать это?

Case2

Мне нужно сопоставить разделы фрейма данных:

df.map_partitions(mapping_func, meta=df)

Внутри mapping_func () я хочу изменить значения в выбранных столбцах, используя partition[column].map или просто создав понимание списка. Опять же, как безопасно изменить раздел и вернуть его из функции сопоставления?

Раздел, полученный функцией сопоставления, представляет собой фрейм данных Pandas (копия исходных данных?), Но при изменении данных на месте я вижу некоторые сбои (хотя сообщений об исключениях / ошибках нет). То же самое и с вызовом partition.copy(deep=False), он не работает. Следует ли глубоко скопировать раздел, а затем изменить его на месте? Или мне всегда следует создавать новый фрейм данных из новых / сопоставленных данных столбца и исходных / немодифицированных серий / столбцов?


person evilkonrex    schedule 05.09.2017    source источник


Ответы (1)


Вы можете безопасно изменять dask.dataframe

Поддерживаются и безопасны следующие операции.

df['col'] = df['col'].map(func)

Это изменяет граф задачи на месте, но не изменяет данные на месте (при условии, что функция func создает новую серию).

Вы не можете безопасно изменять раздел

Ваш второй случай, когда вы map_partitions функция, изменяющая фрейм данных pandas на месте, небезопасен. Dask ожидает, что сможет повторно использовать данные, при необходимости вызывать функции дважды и т. Д. Если у вас есть такая функция, вы должны сначала создать копию фрейма данных Pandas внутри этой функции.

person MRocklin    schedule 05.09.2017
comment
Это все еще правда? Если да, то каков рекомендуемый наилучший метод выполнения мутаций, которые, если бы они были выполнены с использованием pandas, можно было бы выполнить на месте, без удвоения потребления памяти для каждого раздела? - person stav; 08.12.2020