#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
аргумента.