IIUC, вы можете использовать свой точно такой же код и добавить .sort_values('Cat')
, или более просто:
df.melt('Cat',var_name='Label',value_name='Value').sort_values('Cat')
Cat Label Value
0 A L_1 1
3 A L_2 2
6 A L_3 3
1 B L_1 4
4 B L_2 5
7 B L_3 6
2 C L_1 7
5 C L_2 8
8 C L_3 9
Если вы хотите заказать его по-своему (в приведенном ниже примере, B
предшествует A
, что предшествует C
), тогда вы можете установить Cat
в качестве упорядоченного категориального:
melted = df.melt('Cat',var_name='Label',value_name='Value')
melted['Cat'] = pd.Categorical(melted['Cat'], categories=['B','A','C'], ordered=True)
melted.sort_values('Cat')
Cat Label Value
1 B L_1 4
4 B L_2 5
7 B L_3 6
0 A L_1 1
3 A L_2 2
6 A L_3 3
2 C L_1 7
5 C L_2 8
8 C L_3 9
Альтернативой является использование stack
, но тогда вам придется иметь дело с раздражающимипереименование столбцов:
df.set_index('Cat').stack().reset_index().rename(columns={'level_1':'Label', 0:'Value'})
Cat Label Value
0 A L_1 1
1 A L_2 2
2 A L_3 3
3 B L_1 4
4 B L_2 5
5 B L_3 6
6 C L_1 7
7 C L_2 8
8 C L_3 9