Допустим, вы начинаете со списков строк и столбцов, и оба содержат строки и ничего, кроме строк:
from itertools import product
import numpy as np
import pandas as pd
columns = list("abcdefg")
rows = list("abcde")
Возьмите декартовы произведения из списков, объедините элементы в каждой паре и преобразуйте список в массив NumPy:
products = np.array([''.join(x) for x in product(rows, columns)])
Измените список в прямоугольную таблицу, добавьте заголовки строк и столбцов:
pd.DataFrame(products.reshape(-1, len(columns)), index=rows, columns=columns)
# a b c d e f g
#a aa ab ac ad ae af ag
#b ba bb bc bd be bf bg
#c ca cb cc cd ce cf cg
#d da db dc dd de df dg
#e ea eb ec ed ee ef eg