Создать DataFrame по алгориту
Мне необходимо создать DataFrame по алгоритму. Задаваться будет только количество столбцов Необходимо сделать, чтоб в каждом столбце были данные от 1 до 99 Пример Массив из 3-х:
1 1 1
1 1 2
....
1 1 99
1 2 1
1 2 2
...
1 99 99
2 1 1
...
99 99 99
в идеале начальное и конечное число (1 и 99) тоже задать как переменные
Подскажите быстрый способ это сделать. (у меня задача примерно из 10 столбиков. Если делать без dataframe то 3 столбика создаются около 7 секунд, 4 столбика уже 7 минут, а 10 столбиков - наверное не дождусь)
Ответы (2 шт):
Можно создать быстро кортеж через генератор с помощью itertools, и его уже в DataFrame втянуть.
import itertools
from pandas import DataFrame
ids = 1
ide = 100
col = 3
gen = (x for x in itertools.product(*[range(ids, ide + 1) for f in range(col)]))
dfr = DataFrame(tuple(next(gen) for _ in range(ide ** col)))
С точки зрения экономии памяти можно, к примеру, записать на диск данные, которые потом прочитать через read_csv()
import itertools
from pandas import DataFrame, read_csv
ids = 1
ide = 100
col = 4
gen = (x for x in itertools.product(*[range(ids, ide + 1) for f in range(col)]))
with open('t.csv', 'w') as file:
for _ in range((ide) ** col):
file.write('{}\n'.format(','.join(str(r) for r in next(gen))))
dfr = read_csv('t.txt', header=None)
На диске 1.2 Гб, в памяти 3.6 Гб у процесса
Добавлено по комментарию:
На примере варианта 1 меняем параметр ids (id start) на 2, плюс в range(ids, ide + 1, step) в генераторе добавлен параметр шага
import itertools
from pandas import DataFrame
ids = 10
ide = 90
step = 2
col = 3
gen = (x for x in itertools.product(*[range(ids, ide + 1, step) for f in range(col)]))
dfr = DataFrame(tuple(next(gen) for _ in range(((ide - ids) // step + 1) ** col)))
Задача пока не имеет практического решения в настоящее время, т.к. количество элементов в Вашей таблице будет равно 100 в степени 100 и умноженное на 100, на что не хватит оперативной памяти. Если это высоко научный проект, можно попробовать вместо оперативной памяти воспользоваться физической памятью, что, скорее всего, займет очень много времени. Человеческая жизнь от рождения длиться 2 млрд. секунд. Рекомендую сопоставить трудозатраты с ценностью проекта.