#python #pandas #dask #dask-dataframe
#python #панды #dask #dask-фрейм данных
Вопрос:
Я хочу обучить модель на ~ 100 000 текстовых файлах. У Pandas возникли некоторые проблемы с памятью, и он решил перейти на Dask.
Я пытаюсь прочитать файлы в фрейм данных dask, в котором пути к файлам уже сохранены. В pandas я мог бы просто сделать следующее:
ddf['rawtext'] = [open(file, 'rt').read() for file in ddf['filepath']]
Но это выдает NotImplementedError
ошибку.
Есть ли способ эффективно считывать текстовые файлы в Dask?
Ответ №1:
То, что вы можете сделать в Pandas, вы можете сделать в Dask с помощью map
или map_partitions
def read_them(df):
df['rawtext'] = [open(file, 'rt').read() for file in ddf['filepath']]
return df
ddf2 = ddf.map_partitions(read_them)
или
ddf2 = ddf.assign(
raw_text=ddf.filepath.map(lambda x: open(x, 'rt').read())
)
В первом варианте может быть больше символов, но он кажется более простым и более точно соответствует вашему исходному коду.
Какую бы (по строкам) обработку вы ни хотели выполнить с вашим текстом дальше, вы все равно можете выполнить в той же функции.
Ответ №2:
в pandas вам просто нужно указать путь к одному файлу, и он будет обрабатывать I/O
операции за вас, нет необходимости открывать каждый файл и передавать его в список.
dask, как и многие другие большие фреймворки, может принимать каталог объектов и считывать их за один раз.
из документации.
!ls data/*.csv | head
data/2000-01-01.csv
data/2000-01-02.csv
data/2000-01-03.csv
data/2000-01-04.csv
data/2000-01-05.csv
data/2000-01-06.csv
data/2000-01-07.csv
data/2000-01-08.csv
data/2000-01-09.csv
data/2000-01-10.csv
dd.read_csv('data/2000-*-*.csv')
в вашем случае я бы предположил, что это
dd.read_csv('data/*.txt')
Комментарии:
1. спасибо, но единственная проблема, с которой я сталкиваюсь, заключается в том, что using
read_csv
правильно считывает файл. Каждый текстовый файл состоит из нескольких строк, которые я хочу сохранить в одной ячейке. настройкаsep=None
приводит к ошибке синтаксического анализа