Я использую многопроцессорность в python для повышения производительности кода. Вместо добавления результата непосредственно в фрейм данных я использую общий список.
df_list = mp.Manager().list()
Значения вычисляются и добавляются в приведенный выше список различными процессами.
lock.acquire()
try:
temp = [a, b, c, d, e, f, g, h, i, j, k, l, m, n]
df_list.append(temp)
finally:
lock.release()
алфавиты являются переменными, содержащими разные значения.
После завершения дочерних процессов список содержит следующие значения:
print(df_list)
[[0, '2009-10-01', '2010-01-01', 3, 3, 1, 0.25, 0.9, 6, 100000, 101866.70524177742, 7.68, 100000, 0.0],
[1, '2009-10-01', '2010-01-01', 5, 7, 2, 0.25, 0.4, 8, 100000, 101866.70524177742, 9.32, 100000, 0.0]]
Теперь мне нужно преобразовать список в фрейм данных.
cols = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N"]
df = pd.DataFrame(df_list, columns = cols)
Однако я получаю следующую ошибку:
ValueError Traceback (most recent call last)
~\Desktop\Temp\Python\calculate.py in <module>
469 print(df_list)
470
--> 471 df = pd.DataFrame(df_list, columns = cols)
472
~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\frame.py in __init__(self, data, index, columns, dtype, copy)
466 dtype=values.dtype, copy=False)
467 else:
--> 468 raise ValueError('DataFrame constructor not properly called!')
469
470 NDFrame.__init__(self, mgr, fastpath=True)
Не могли бы вы сообщить мне, если я делаю что-то не так.
РЕДАКТИРОВАТЬ: Если мы заменяем список стандартным списком, который он работает (как уже упоминалось в комментариях). Тем не менее, в многопроцессорной среде нам нужен список менеджера для совместного использования между процессами.
Кроме того, я нашел обходной путь, и он, кажется, работает:
simple_list = []
for l in df_list:
simple_list.append(l)
df = pd.DataFrame(simple_list, columns = cols)
Однако, как вы можете видеть, не очень элегантный способ делать вещи. Тем не менее, остается вопрос: почему я не могу преобразовать список менеджера в фрейм данных за один шаг. Может я что-то не так делаю?