python - 如何对组进行排序,使第一行中的数字最大,第二行中的数字最小,第三行中的数字第二大,依此类推

标签 python pandas sorting pandas-groupby columnsorting

所以我有一个这样的 df

In [1]:data= {'Group': ['A','A','A','A','A','A','B','B','B','B'],
    'Name': [ ' Sheldon Webb',' Traci Dean',' Chad Webster',' Ora Harmon',' Elijah Mendoza',' June Strickland',' Beth Vasquez',' Betty Sutton',' Joel Gill',' Vernon Stone'],
    'Performance':[33,64,142,116,122,68,95,127,132,80]}
In [2]:df = pd.DataFrame(data, columns = ['Group', 'Name','Performance'])

Out[1]:
    Group  Name             Performance
0    A     Sheldon Webb       33
1    A     Traci Dean         64
2    A     Chad Webster      142
3    A     Ora Harmon        116
4    A     Elijah Mendoza    122
5    A     June Strickland    68
6    B     Beth Vasquez       95
7    B     Betty Sutton      127
8    B     Joel Gill         132
9    B     Vernon Stone       80
我想以这样一种交替的方式对其进行排序,在一个组中,比如说“A”组,第一行应该是表现最好的人(在这种情况下是“Chad Webster”),然后在第二行是表现最差的人(即是“谢尔顿·韦伯”)。
我正在寻找的输出看起来像这样:
Out[2]:
    Group   Name             Performance
0    A     Chad Webster      142
1    A     Sheldon Webb       33
2    A     Elijah Mendoza    122
3    A     Traci Dean         64
4    A     Ora Harmon        116
5    A     June Strickland    68
6    B     Joel Gill         132
7    B     Vernon Stone       80
8    B     Betty Sutton      127
9    B     Beth Vasquez       95
您可以看到序列在组内的最高和最低之间交替。

最佳答案

采用排序顺序,然后对其应用二次函数,其中根是数组长度的 1/2(加上一些小偏移量)。通过这种方式,最高排名被赋予极值(eps 偏移量的符号决定了您是否希望排名高于最低值的最高值)。我在最后添加了一个小组来展示它如何正确处理重复值或奇数组大小。

def extremal_rank(s):
    eps = 10**-4
    y = (pd.Series(np.arange(1, len(s)+1), index=s.sort_values().index) 
         - (len(s)+1)/2 + eps)**2
    return y.reindex_like(s)
    
df['rnk'] = df.groupby('Group')['Performance'].apply(extremal_rank)
df = df.sort_values(['Group', 'rnk'], ascending=[True, False])
   Group              Name  Performance     rnk
2      A      Chad Webster          142  6.2505
0      A      Sheldon Webb           33  6.2495
4      A    Elijah Mendoza          122  2.2503
1      A        Traci Dean           64  2.2497
3      A        Ora Harmon          116  0.2501
5      A   June Strickland           68  0.2499
8      B         Joel Gill          132  2.2503
9      B      Vernon Stone           80  2.2497
7      B      Betty Sutton          127  0.2501
6      B      Beth Vasquez           95  0.2499
11     C                 b          110  9.0006
12     C                 c           68  8.9994
10     C                 a          110  4.0004
13     C                 d           68  3.9996
15     C                 f           70  1.0002
16     C                 g           70  0.9998
14     C                 e           70  0.0000

关于python - 如何对组进行排序,使第一行中的数字最大,第二行中的数字最小,第三行中的数字第二大,依此类推,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63194140/

相关文章:

c# - 如何使用 LINQ 按深度级别对对象层次结构进行排序?

python - Django:Cookie 设置为 30 秒后过期实际上是 30 分钟后过期?

python - Opencv写视频正在运行,但保存的output.avi文件为0KB

javascript - 如何使用 selenium 驱动程序单击元素?

python - celery 任务消失

python - Pandas 从距离矩阵中按 ID 提取列和行

python - Pandas 选择 n 中间行

python - 字符串在表中每隔 n 个空格分割一行

java - 如何找到字符串中最高的字母?

arrays - 未排序的移位数组的位移