unstacked = df.unstack()
дает вам первый шаг:
A1 0 1001
1 5001
2 7001
A2 0 1002
1 5002
2 7002
A3 0 1003
1 5003
2 7003
A4 0 1004
1 5004
2 7004
Затем вы можете извлечь два «уровня» индекса:
colname = unstacked.index.get_level_values(0) # A1,A1,A1,A2,...
rownum = unstacked.index.get_level_values(1) # 0,1,2,0,...
Затем преобразовать их в нужный формат:
idxchr = (rownum + ord('A')).map(chr) # A,B,C,A,...
idxnum = colname.str[1] # 1,1,1,2,...
И, наконец, перезаписать индекс без учета стека:
unstacked.index = idxchr + idxnum
Результат:
A1 1001
B1 5001
C1 7001
A2 1002
B2 5002
C2 7002
A3 1003
B3 5003
C3 7003
A4 1004
B4 5004
C4 7004
Редактировать: Вы редактировали свой вопрос, пока я писал этот ответ,теперь вам может понадобиться немного улучшить его, чтобы он работал с новым примером ввода, который вы опубликовали.