I am able to make a dirty solution. It works, but I still hope some expert may help you to simplify the code.
The solution is just to create an empty dataframe based on the information we know, then gradually fill in the columns as needed.
import pandas as pd
row1 = ['ISO3', 'ARG', 'ARG', 'ARG', 'ZMB', 'ZMB', 'ZMB']
row2 = ['Status.YR1', 12, 16, 15, 12, 14, 13]
df = pd.DataFrame([row1, row2], columns = ['index', 2001, 2002, 2003, 2001, 2002, 2003])
# Creating list of cols and rows
cols = [x for x in df.loc[0].unique() if x != 'ISO3']
rows = [x for x in set(df.columns) if x != 'index']
# An empty dataframe as placeholder
df_final = pd.DataFrame(index=rows, columns = cols)
# Gradually fill in the dataframe
for i, (idx, row) in enumerate(df.transpose().iterrows()):
if i == 0:
continue
year = idx
country = row[0]
value = row[1]
df_final.loc[year, country] = value
Then df_final
is what you need.