Как использовать функцию для строк с помощью Dask?

#pandas #nltk #dask #dask-dataframe

#pandas #nltk #dask #dask-фрейм данных

Вопрос:

У меня большой набор данных, и я недавно познакомился с Dask. Я пытаюсь обозначить текст в каждой строке. Это очень легко сделать в pandas, как показано ниже, но у меня ошибка, говорящая

Ошибка атрибута: объект ‘DataFrame’ не имеет атрибута ‘lower’, когда я пытаюсь использовать Dask (см. Вторую группу кодов ниже)

 import pandas as pd
import dask 
import dask.dataframe as dd

 def to_lower(text):
        return text.lower()

df_2016 = pd.read_csv("2016_Cleaned_DroppedDup.csv")
df_2016['token2'] = df_2016['token2'].apply(lambda x: pr.to_lower(x))
  

С помощью DASK:

 df_2016 = dd.from_pandas(df_2016, npartitions = 4 * multiprocessing.cpu_count())
df_2016 = df.2016.map_partitions.(lambda df: df.apply(lambda x: pr.to_lower(x))).compute(scheduler = 'processes')
  

Ответ №1:

Я бы рекомендовал в будущем предоставлять код, который создает фрейм данных, чтобы никто не догадывался, как на самом деле выглядят ваши данные. Но я думаю, что этот случай был достаточно простым. Кроме того, я думаю, что в коде, который вы предоставили, были синтаксические ошибки, например, df.2016.map_partitions должно быть df_2016.map_partitions . Кроме того, неясно, что это за pr объект в вашем коде.

Учитывая эти ошибки, я просто переписал, что я буду делать для работы со строками в dask и pandas, используя .str метод в минимальном рабочем примере, аналогичном вашей настройке. Для этого существует очень небольшая разница в синтаксисе между pandas и dask.

РЕДАКТИРОВАТЬ: добавлена пользовательская функция ( to_lower ), чтобы привести пример использования .apply в dask.

 import pandas as pd
import dask.dataframe as dd

def to_lower(text):
    return text.lower()

# using pandas
df_2016 = pd.DataFrame({'token2':['HI']*100   ['YOU']*100})
df_2016['token2_low'] = df_2016['token2'].str.lower()
df_2016['token2_low_apply'] = df_2016['token2'].apply(to_lower)
df_2016
  
     token2 token2_low token2_low_apply
0       HI         hi               hi
1       HI         hi               hi
2       HI         hi               hi
3       HI         hi               hi
4       HI         hi               hi
..     ...        ...              ...
195    YOU        you              you
196    YOU        you              you
197    YOU        you              you
198    YOU        you              you
199    YOU        you              you

[200 rows x 3 columns]
  
 # using dask
ddf_2016 = dd.from_pandas(df_2016[['token2']], npartitions=10)
ddf_2016['token2_low'] = ddf_2016['token2'].str.lower()
ddf_2016['token2_low_apply'] = ddf_2016['token2'].apply(to_lower, meta=('token2', 'object'))

ddf_2016.compute()
  
     token2 token2_low token2_low_apply
0       HI         hi               hi
1       HI         hi               hi
2       HI         hi               hi
3       HI         hi               hi
4       HI         hi               hi
..     ...        ...              ...
195    YOU        you              you
196    YOU        you              you
197    YOU        you              you
198    YOU        you              you
199    YOU        you              you

[200 rows x 3 columns]
  

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

1. Привет, большое вам спасибо и извините за сбивающий с толку вопрос. Но не могли бы вы также привести пример, в котором функция def использовалась для фрейма данных dask через lambda apply?

2. конечно. синтаксис действительно похож на pandas, за исключением того, что dask запрашивает типы вывода при использовании apply, поэтому ему не нужно угадывать на основе небольшой подвыборки. это причина meta аргумента.