Здесь проблема в том, что у нас нет четкого суффикса (первая запись для каждой группы без суффикса) для pd.wide_to_long
, поэтому сначала изменили столбцы, а затем применили pd.wide_to_long
:
m = df.set_index(['id','Name'])
cols = m.columns.str.replace('\d+','').to_series()
m.columns=cols.add(cols.groupby(cols).cumcount().astype(str))
out = (pd.wide_to_long(m.reset_index(),['code','type'],['id','Name'],'idx')
.reset_index(['id','Name']))
id Name code type
idx
0 0 ABC 1.0 S
1 0 ABC 4.0 E
2 0 ABC 8.0 T
0 1 XYZ 2.0 R
1 1 XYZ NaN NaN
2 1 XYZ 5.0 U
Код для воспроизведения кадра данных:
d = {'id': {0: 0, 1: 1},
'Name': {0: 'ABC', 1: 'XYZ'},
'code': {0: 1, 1: 2},
'code1': {0: 4.0, 1: np.nan},
'code2': {0: 8, 1: 5},
'type': {0: 'S', 1: 'R'},
'type1': {0: 'E', 1: np.nan},
'type2': {0: 'T', 1: 'U'}}
df = pd.DataFrame(d)