_df = df.ix[0:-1, df.columns]
// List of unique values from every column
lst = [x.unique().tolist()for x in (df[c] for c in df)]
rows = itertools.product(*lst)
for i, row in enumerate(rows):
_df.loc[i] = row
After Change
of the values in the columns
// List of unique values from every column
lst = (x.unique() for x in (df[c] for c in df))
rows = list(itertools.product(*lst))
_df = pd.DataFrame(rows, columns=df.columns)
// preserve the column dtypes