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

时间:2018-10-10 22:59:22

标签: python pandas dataframe

我有一个数据框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
...

可以在熔解功能中强制执行所需的行顺序吗? 如果没有,如何实现这种自定义排序?


更新

我重命名了标签,因为它们不遵循字母顺序,所以简单的排序不起作用

1 个答案:

答案 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

如果要以自定义方式订购(在下面的示例中,BA之前,CCat之前),则可以将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}}