Python 按列对数据帧中的某些行进行排序
我有一个未排序的数据帧。我想按降序(从大到小)对Python 按列对数据帧中的某些行进行排序,python,sorting,pandas,dataframe,Python,Sorting,Pandas,Dataframe,我有一个未排序的数据帧。我想按降序(从大到小)对A、B、C和D列进行排序,但它们必须保留在面额组中。例如,它应该按列A、B、C和D对面额100进行排序,因此行0,1,2更改为0,2,1 Index Denomination A B C D 0 100 5 0 0 0 1 100 0 0 1 0 2 100 0 2 0 0 3
A
、B
、C
和D
列进行排序,但它们必须保留在面额组中。例如,它应该按列A
、B
、C
和D
对面额100进行排序,因此行0,1,2更改为0,2,1
Index Denomination A B C D
0 100 5 0 0 0
1 100 0 0 1 0
2 100 0 2 0 0
3 200 5 2 0 0
4 200 5 0 1 0
5 200 0 4 0 0
6 200 10 0 0 0
7 200 0 2 1 0
8 200 0 0 2 0
排序级别的顺序必须是A
,B
,C
,然后是D
。重新标记索引并不重要。
生成的数据帧应为:
Index Denomination A B C D
0 100 5 0 0 0
2 100 0 2 0 0
1 100 0 0 1 0
6 200 10 0 0 0
3 200 5 2 0 0
4 200 5 0 1 0
5 200 0 4 0 0
7 200 0 2 1 0
8 200 0 0 2 0
这可以在excel中通过选择行然后应用自定义排序来完成,但我需要在python中使用dataframes来完成。这应该可以做到:
df.sort_values(by=['Denomination', 'A', 'B', 'C', 'D'],
ascending=[True, False, False, False, False])
Out:
Denomination A B C D
0 100 5 0 0 0
2 100 0 2 0 0
1 100 0 0 1 0
6 200 10 0 0 0
3 200 5 2 0 0
4 200 5 0 1 0
5 200 0 4 0 0
7 200 0 2 1 0
8 200 0 0 2 0
按面额
升序排序;如果是领带,则按A
降序排序;如果是平局,则按B
降序排序,依此类推
如果面额列不应排序,但应按组的显示顺序保留,则可以执行以下操作:
df.groupby('Denomination')['Denomination'].transform(pd.Series.first_valid_index)
Out:
0 0
1 0
2 0
3 3
4 3
5 3
6 3
7 3
8 3
Name: Denomination, dtype: int64
这将返回一个新列以跟踪组。您可以将此列添加到数据帧,并且它可以具有最高优先级
(df.assign(denomination_group =
df.groupby('Denomination')['Denomination'].transform(pd.Series.first_valid_index))
.sort_values(by=['denomination_group', 'A', 'B', 'C', 'D'],
ascending=[True, False, False, False, False])
.drop('denomination_group', axis=1))