Создайте новый объект columns
, разделив имена существующих столбцов.Это само собой разумеющееся, что у нас есть однозначные буквы, за которыми следует одна цифра.
d = df.set_index('ID')
d.columns = d.columns.map(tuple)
d.stack().reset_index('ID')
ID A B
1 1 3 4
2 1 5 6
1 2 7 8
2 2 9 10
Одна строка
df.set_index('ID').rename(columns=tuple).stack().reset_index('ID')
Более обобщенно
d = df.set_index('ID')
s = d.columns.str
d.columns = [
s.extract('^(\D+)', expand=False),
s.extract('(\d+)$', expand=False)
]
d.stack().reset_index('ID')