Dask: маскирование фрейма данных на основе нескольких условий для выполнения выборочных вычислений

#python-3.x #pandas #dask #dask-dataframe

#python-3.x #pandas #dask #dask-фрейм данных

Вопрос:

Я ищу замену значений в строках, где при использовании dask выполняется несколько условий. Предварительно установленное значение, с помощью которого я буду выполнять замену, присутствует в одном столбце, и если условие выполнено, я заменю целевое значение на предварительно установленное значение.

Я бы хотел остаться в dask, а не выполнять это действие с другой библиотекой, если это возможно, из-за ограничений памяти при перемещении фреймов данных.

На данный момент я пытаюсь использовать команду .mask .

Где GrassDeadFMC >= 12 и скорость ветра <= 10, тогда сделайте GrassFMCoefficient равным значению в GFMG12L10 . ddf['GrassFMCoefficient'] = ddf['GFMG12L10'].mask(ddf['GrassDeadFMC'] >= 12 amp; ddf['WindSpeed'] <= 10)

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

 ValueError: Metadata inference failed in `and_`.

Original error is below:
------------------------
TypeError('cannot compare a dtyped [float32] array with a scalar of type [bool]')
 

Минимальный исполняемый скрипт, который выдает немного другую ошибку, но, вероятно, страдает от той же проблемы, я думаю.

 import dask.dataframe as dd
import pandas as pd
from random import randint
df = pd.DataFrame({'GrassFMCoefficient': [0 for x in range(10)],
                   'GFMG12L10': [randint(1, 50) for x in range(10)],
                   'GrassDeadFMC': [randint(1, 50) for x in range(10)],
                   'WindSpeed': [randint(1, 30) for x in range(10)]})
ddf = dd.from_pandas(df,npartitions=1)
ddf['GrassFMCoefficient'] = ddf['GFMG12L10'].mask(ddf['GrassDeadFMC'] >= 12 amp; ddf['WindSpeed'] <= 10)
print(ddf.head(10))
 

Любая помощь по этому вопросу будет оценена.

Ответ №1:

вы хотите получить такой результат??

вы хотите получить такой результат?

вы должны изолировать каждое условие с Bracket '()' помощью, например (condition1) amp; (condition2) . , это также делает логическое сравнение с логическим.

 ddf['GrassFMCoefficient'] = ddf['GFMG12L10'].mask((ddf['GrassDeadFMC'] >= 12) amp; (ddf['WindSpeed'] <= 10))
 

Комментарии:

1. Спасибо. Эта строка работает в приведенном мной примере, но не в моем полном сценарии. Мне нужно немного покопаться.

2. На самом деле — у меня была другая похожая проблема в следующей строке. Ваш ответ решил проблему. Спасибо!