Эффективный для памяти способ преобразования серии списков строк Pandas в разреженный DataFrame - PullRequest
0 голосов
/ 04 ноября 2019

Я хочу оптимизировать функцию, которая принимает в качестве аргумента Серию, заполненную большими строками текста, а затем возвращает DataFrame, каждый столбец которого заполняется словами из входящего текста. Это то, что я делал, чтобы добиться этого:

Скажем, что входная серия X:

X.str.split()\
.apply(pd.Series)

Это работает, но для больших наборов данных требуется огромное количество памяти. Это было также тогда, когда я понял, что весь набор данных может не полностью поместиться в память как плотный DataFrame. Итак, я попробовал это:

Y = X.str.split()
U = list(map(lambda x: pd.SparseArray(x), Y.to_list(x)))
Z = pd.DataFrame(U)

Я не использовал pd.SparseDataFrame, потому что он устарел и не работает, когда я передаю его другим функциям в коде.

Проблема с этой попыткой сейчас состоит в том, что строка для Z занимает слишком много времени для обработки, возможно, потому что я не реализовал это правильно. Итак, мой вопрос: как мне сделать так, чтобы это не занимало вечность? Я также пытался поиграть с dask, но я слишком новичок в этом, чтобы придумать что-нибудь приличное.

Edit

Мне удалось использовать dask для распространениявычисление на двух компьютерах с использованием следующего:

import dask.dataframe as dd
from dask.distributed import Client

client = Client("address")

max_cols = D.str.count(" ").max().compute()+1
X = client.scatter(X)
S = client.submit(lambda x: x.str.split(n=max_cols, expand=True),X)

Это окончательно решает проблему с памятью, поскольку я могу ограничить ее из настроек кластера, но теперь используется только одно ядро, хотя их 16их в наличии. Как я могу это исправить?

...