Ну, вы можете использовать расплав. Давайте возьмем этот df например:
df = pd.DataFrame(np.arange(20).reshape(4,5),columns=["a","b","c","d","e"])
#Output
a b c d e
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
Теперь вы немного переверните его и получите то, что хотите:
intermediate = pd.melt(df,id_vars=["index"],value_vars=df.columns.difference(["index"]))
cols = intermediate["variable"].astype("str") + "_" + intermediate["index"].astype("str")
final_df = pd.DataFrame(columns=cols.values,data=intermediate["value"].values.reshape(1,20))
#Output
a_0 a_1 a_2 a_3 b_0 b_1 b_2 b_3 c_0 c_1 c_2 c_3 d_0 d_1 d_2 d_3 e_0 e_1 e_2 e_3
0 5 10 15 1 6 11 16 2 7 12 17 3 8 13 18 4 9 14 19
но я уверен, что есть более чистый способ сделать это.