python:如何融合保持特定顺序/自定义排序的数据帧
我有一个数据帧dfpython:如何融合保持特定顺序/自定义排序的数据帧,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
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后设置它。