根据列对熊猫数据框数据进行排列/排序

时间:2019-05-24 02:49:51

标签: python pandas python-2.7 numpy

我是熊猫新手。我需要根据组内的循环顺序以降序对数据值进行排序和分组。我有以下数据框:

Col1 Col2  
A     5030 
B     4250
c     3340
D     2100
A     5044
B     4790
C     3482
C     3233
A      5099
B      4820
D      2345
D      2784
A      5999

我需要对数据帧进行排序,以使Col2中的所有值在Col1内以从高到低的循环顺序排列。例如,将首先对(A,B,C,D)的所有最高值进行排序,然后再对(A,B,C,D)的第二高值进行排序,然后再对(A,B,C,D)的第三高值进行排序B,C,D)组需要关注,依此类推。

排序后的最终数据框应如下所示:

Col1     Col2

A         5999
B         4820
C         3482
D         2784
A         5099
B         4790
C         3340
D         2345
A         5044
B         4250
C         3233
D         2100
A         5030

Col1除(A,B,C,D)之外将没有其他任何值。但是在某些情况下,Col1中仅存在2或3个不同的值。因此,需要相应地制定逻辑。

我可以通过以下步骤解决问题:

  1. 根据Col1中的不同值创建单独的数据框。
  2. 基于Col2中的值以降序对每个子数据帧进行排序和索引。
  3. 然后遍历子数据帧的索引,并将数据添加到每个子数据帧的新数据帧中。

此过程似乎不是最佳方法。因此,我正在寻找有关更简单的本机解决方案的建议。

1 个答案:

答案 0 :(得分:3)

IIUC使用cumcount

创建新密钥
df['Key']=df.sort_values('Col2',ascending=False).groupby('Col1').cumcount()
df=df.sort_values(['Key','Col1']).drop('Key',1)
df
Out[453]: 
   Col1  Col2
12    A  5999
9     B  4820
6     C  3482
11    D  2784
8     A  5099
5     B  4790
2     C  3340
10    D  2345
4     A  5044
1     B  4250
7     C  3233
3     D  2100
0     A  5030