Можно попытаться получить категориальные коды столбцов с последующим наложением и преобразованием индекса в кортеж
df.columns = df.columns.to_series().astype('category').cat.codes
df1 = df.stack().reorder_levels([1,0]).sort_index()
df1.index = tuple(df1.index)
Out:
(0, 01.01.2000) a1
(0, 01.02.2000) a2
(0, 01.03.2000) a3
(1, 01.01.2000) b1
(1, 01.02.2000) b2
(1, 01.03.2000) b3
(2, 01.01.2000) c1
(2, 01.02.2000) c2
(2, 01.03.2000) c3
dtype: object
** Редактировать **
Сортировка данных по уровням индекса
df.index = pd.to_datetime(df.index)
df.columns = df.columns.to_series().astype('category').cat.codes
df1 = df.stack().reorder_levels([1,0]).sort_index(level=1)
df1.index = tuple(df1.index)
Out:
(0, 2000-01-01 00:00:00) a1
(1, 2000-01-01 00:00:00) b1
(2, 2000-01-01 00:00:00) c1
(0, 2000-01-02 00:00:00) a2
(1, 2000-01-02 00:00:00) b2
(2, 2000-01-02 00:00:00) c2
(0, 2000-01-03 00:00:00) a3
(1, 2000-01-03 00:00:00) b3
(2, 2000-01-03 00:00:00) c3
dtype: object