python:如何融合保持特定顺序/自定义排序的数据帧

python:如何融合保持特定顺序/自定义排序的数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据帧df Cat B_1 A_2 C_3 A 1 2 3 B 4 5 6 C 7 8 9 我想将其转换为数据帧,以便列标签中的行遵循每个类别的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

我有一个数据帧df

Cat  B_1 A_2 C_3
A      1   2   3
B      4   5   6
C      7   8   9
我想将其转换为数据帧,以便列标签中的行遵循每个类别的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
...
在melt函数中是否可以强制执行所需的行顺序? 如果没有,如何实现这种自定义排序?


更新


我重命名了标签,因为它们不按字母顺序排列,因此简单的排序不起作用

IIUC,您可以使用完全相同的代码并添加
.sort\u值('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
另一种方法是使用
堆栈
,但随后必须处理恼人的列重命名:

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

我应该说,这些列不遵循字母顺序,那么作为替代方法的
stack
方法可能更可取,这样行吗?否则,您可以将
Cat
设置为一个有序的分类变量,但这会添加一个完整的单独步骤i更新标签,使其不遵循字母顺序。然后,简单的排序不会给我标签列中所需的行顺序。请参阅我的关于有序分类的更新。注意:我还询问了melt的行为,因为出于某种原因,我无法在使用melt后保留有序的分类数据类型,因此我必须在使用melt后设置它。