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/

相关文章:

python - BeautifulSoup:查找第 n 次出现的元素

python - 在字典的链式实现中检查值

python - 获取特定列的列名

python - 将某些奇怪格式的df行更改为列

arrays - Swift 中的最接近匹配字符串数组排序

android - 按日期排序 ListView Android

python - 在HTML页面中查找与特定URL模板匹配的所有链接

java - 无法在具有 56GB RAM 的 PySpark 本地模式下加载 25GB 数据集

python - 根据条目从 pandas.Dataframe 中删除行

php - 如何检查数字 2D PHP 数组的值是否为 'incereasing' 、 'descending' 或 'mixed' 顺序?