Чтение текстовых файлов в фрейм данных Dask

#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 приводит к ошибке синтаксического анализа