Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按列对数据帧中的某些行进行排序_Python_Sorting_Pandas_Dataframe - Fatal编程技术网

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))