Python 按多列排序按另一列分组

Python 按多列排序按另一列分组,python,pandas,Python,Pandas,我试图根据两个不同列的值,按键列对数据帧分组进行排序 每行代表一条具有给定密钥的路由。不同的路由可以共享同一个密钥。每条路线都有若干接触点和总时间。如果触摸相同,我想按触摸和总时间进行排名 考虑以下数据帧 route key touches total_tt 0 R1 key1 1 10 1 R2 key1 2 20 2 R3 key1 2 23 3 R4 key1 3 20 4 R5 key1 3 20

我试图根据两个不同列的值,按键列对数据帧分组进行排序

每行代表一条具有给定密钥的路由。不同的路由可以共享同一个密钥。每条路线都有若干接触点和总时间。如果触摸相同,我想按触摸和总时间进行排名

考虑以下数据帧

    route   key touches total_tt
0   R1  key1    1   10
1   R2  key1    2   20
2   R3  key1    2   23
3   R4  key1    3   20
4   R5  key1    3   20
5   R6  key1    3   30
6   R7  key2    3   30

我希望排名如下

    route   key touches total_tt    rank
0   R1  key1    1   10  1
1   R2  key1    2   20  2
2   R3  key1    2   23  3
3   R4  key1    3   20  4
4   R5  key1    3   20  4
5   R6  key1    3   30  5
6   R7  key2    3   30  1

sort
groupby
+
ngroup
以您的排名标记每组。减去每个
'key'
中的最小排名,即可得到组中所需的排名

cols = ['key', 'touches', 'total_tt']

df['rank'] = df.sort_values(cols).groupby(cols, sort=False).ngroup()
df['rank'] = df['rank'] - df.groupby('key')['rank'].transform('min') + 1

输出:

  route   key  touches  total_tt  rank
0    R1  key1        1        10     1
1    R2  key1        2        20     2
2    R3  key1        2        23     3
3    R4  key1        3        20     4
4    R5  key1        3        20     4
5    R6  key1        3        30     5
6    R7  key2        3        30     1

你想要5作为最后一个等级吗?不,因为键会不同,在这种情况下等级将是1