按最小索引号对 Pandas 数据帧组进行排序,然后根据第 3 列对组内的所有其他列重新排序

Order Pandas dataframe groups by minimum index number, then re-order all other columns within groups based on a 3rd column

提问人:Hack-R 提问时间:10/12/2017 最后编辑:Hack-R 更新时间:10/12/2017 访问量:40

问:

我有一个这样的数据帧:

import numpy as np
import pandas as pd

columns=['Order', 'Group_code', 'Grade', 'Contextual_info']

data = np.array([np.arange(6)]*4).T
mydf = pd.DataFrame(data, columns=columns)

mydf.Order = [1,2,3,4,5,6]
mydf.Group_code = ['group99','group2','group2','group2','group12','group12']
mydf.Grade = [80,0,60,80,85,70]
mydf.Contextual_info = [5,4,3,2,1,0]

mydf
   Order Group_code  Grade Contextual_info
0      1    group99     80               5
1      2     group2      0               4  
2      3     group2     60               3          
3      4     group2     80               2
4      5    group12     85               1
5      6    group12     70               0

这是由 .我想保留 by 的顺序,因此 中的列值不应更改。OrderGroup_codeOrderGroup_code

但是,在每个组中,我想按 的降序排列行。最后,我将用一个新的整数向量 1 替换......n,因此在本例中它仍然是 1、2、3、4、5、6。Group_codeGradeOrder

期望的结果:

   Order Group_code  Grade  Contextual_info
      1    group99     80                 5
      2     group2     80                 2 
      3     group2     60                 3
      4     group2      0                 4
      5    group12     85                 1
      6    group12     70                 0
Python Pandas 排序

评论


答:

2赞 Zero 10/12/2017 #1

In [677]: mydf.Grade = (mydf.groupby('Group_code')['Grade']
                            .transform(pd.Series.sort_values, ascending=False))

In [678]: mydf
Out[678]:
  Order Group_code  Grade
0      1    group99     80
1      2     group2     80
2      3     group2     60
3      4     group2      0
4      5    group12     85
5      6    group12     70

评论

0赞 Bharath M Shetty 10/12/2017
我认为更简单的一个是mydf.Grade = mydf.groupby('Group_code')['Grade'].transform(sorted,reverse=True)
0赞 Hack-R 10/12/2017
这太棒了。有一种方法我可能过于简化了这一点。我正在尝试对数据帧进行排序,而不仅仅是一列。这可能不清楚,因为这个例子太少了。在现实世界中,还有许多其他列也应该进行排序。为此调整这个容易吗?我只是调整了示例以使其更清楚。