我有一个数据框df
Cat B_1 A_2 C_3
A 1 2 3
B 4 5 6
C 7 8 9
我想将其转换为数据框,以使Label列中的行遵循每个类别的df列的顺序。
Desired output
Cat Label Value
A B_1 1
A A_2 2
A C_3 3
B B_1 4
B A_2 5
B C_3 6
C B_1 7
C A_2 8
C C_3 9
当我尝试
pd.melt(df, id_vars=["Cat"], var_name="Label",value_name="Value")
我在“标签”列中丢失了所需的顺序,结果排序如下,
Cat Label Value
A B_1 1
B B_1 4
C B_1 7
A A_2 2
...
可以在熔解功能中强制执行所需的行顺序吗? 如果没有,如何实现这种自定义排序?
更新
我重命名了标签,因为它们不遵循字母顺序,所以简单的排序不起作用
答案 0 :(得分:2)
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
,但是您必须处理恼人的列重命名:
{{1}}