Создайте столбец условия if-else в кадре данных dask

Мне нужно создать столбец, основанный на каком-то условии в кадре данных dask. В пандах это довольно просто:

ddf['TEST_VAR'] = ['THIS' if x == 200607 else  
              'NOT THIS' if x == 200608 else 
              'THAT' if x == 200609 else 'NONE'  
              for x in ddf['shop_week'] ]

Находясь в dask, я должен сделать то же самое, что и ниже:

def f(x):
    if x == 200607:
         y= 'THIS'
    elif x == 200608 :
         y= 'THAT'
    else :
         y= 1 
    return y

ddf1 = ddf.assign(col1 = list(ddf.shop_week.apply(f).compute()))
ddf1.compute()

Вопросы:

  1. Есть ли лучший / более простой способ добиться этого?
  2. Я не могу изменить первый фрейм данных ddf, мне нужно создать ddf1, чтобы изменения были в dask dataframe Неизменяемый объект?

person Puneet Tripathi    schedule 27.07.2016    source источник


Ответы (3)


Ответы:

  1. То, что вы делаете сейчас, почти нормально. Вам не нужно звонить compute, пока вы не будете готовы к окончательному ответу.

    # ddf1 = ddf.assign(col1 = list(ddf.shop_week.apply(f).compute()))
    ddf1 = ddf.assign(col1 = ddf.shop_week.apply(f))
    

    В некоторых случаях dd.Series.where может подойти

    ddf1 = ddf.assign(col1 = ddf.shop_week.where(cond=ddf.balance > 0, other=0))
    
  2. Начиная с версии 0.10.2, теперь вы можете вставлять столбцы прямо в dask.dataframes.

    ddf['col'] = ddf.shop_week.apply(f)
    
person MRocklin    schedule 27.07.2016
comment
Фреймы данных dask изменяемы по умолчанию или они изменяются после выпуска версии 0.10.2? - person Puneet Tripathi; 28.07.2016
comment
В самой последней версии Dask, версии 0.10.2, dask.dataframes поддерживает назначение столбцов. - person MRocklin; 28.07.2016
comment
Спасибо за ответ @MRocklin - person Puneet Tripathi; 28.07.2016

Вы можете просто использовать:

f = lambda x: 'THIS' if x == 200607 else 'NOT THIS' if x == 200608 else 'THAT' if x == 200609 else 'NONE'

А потом:

ddf1 = ddf.assign(col1 = list(ddf.shop_week.apply(f).compute()))

К сожалению, на второй вопрос у меня нет ответа или я его не понимаю ...

person Ohumeronen    schedule 27.07.2016

Лучшим подходом может быть вытащить столбец как массив dask, а затем выполнить несколько вложенных операций where перед добавлением его обратно в фрейм данных:

import dask.array as da

x = ddf['shop_week'].to_dask_array()

df['TEST_VAR'] = \
    da.where(x == 200607, 'THIS',
    da.where(x == 200608, 'NOT THIS',
    da.where(x == 200609, 'THAT', 'NONE')))

df['TEST_VAR'].compute()
person Zelazny7    schedule 19.12.2020