Shaping columns (and column headers) into multi-index rows using pivot/pivot_table
For this I would perform two steps, first transforming the data from a wide to long format using pandas.melt (i.e. transform the TP columns over the rows) and then use pandas.pivot to get the desired format.
result = (
    df
    .melt(id_vars=[&quot;POC_Code&quot;, &quot;Trading_date&quot;])
    .pivot(index=[&quot;Trading_date&quot;, &quot;variable&quot;], columns=&quot;POC_Code&quot;)
    .reset_index()
)

result

# Trading_date variable  value       
#                         ARA    BPE
#   1/04/2018      TP1  10120   3545
#   1/04/2018      TP2  10170   4329
#   1/04/2018      TP3  10200   3465
#   2/04/2018      TP1  11760  12749
#   2/04/2018      TP2  11790  13793
#   2/04/2018      TP3  11750  13943
#   3/04/2018      TP1  25930  11358
#   3/04/2018      TP2  25890  15448
#   3/04/2018      TP3  25860  16132

If you want to change the column names you can simply assign the new column names to df.columns:
result.columns = [&quot;Trading_date&quot;, &quot;TP&quot;, &quot;ARA&quot;, &quot;BPE&quot;]