Создать 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 шт):

Автор решения: Andy Pavlov

Можно создать быстро кортеж через генератор с помощью 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)))
→ Ссылка
Автор решения: konstantinmakovsky

Задача пока не имеет практического решения в настоящее время, т.к. количество элементов в Вашей таблице будет равно 100 в степени 100 и умноженное на 100, на что не хватит оперативной памяти. Если это высоко научный проект, можно попробовать вместо оперативной памяти воспользоваться физической памятью, что, скорее всего, займет очень много времени. Человеческая жизнь от рождения длиться 2 млрд. секунд. Рекомендую сопоставить трудозатраты с ценностью проекта.

→ Ссылка