手动计算多列的平均排名

问题描述 投票:0回答:1

我正在寻找一种方法来生成基于多个列的平均值的方法,其中一个包含字符串,另一个包含整数(很容易超过2列,但为了简单起见,我限制为2列)。

import pandas as pd
df = pd.DataFrame(data={'String':['a','a','a','a','b','b','c','c','c','c'],'Integer':[1,2,3,3,1,3,6,4,4,4]})
print(df)
  String  Integer
0      a        1
1      a        2
2      a        3
3      a        3
4      b        1
5      b        3
6      c        6
7      c        4
8      c        4
9      c        4

这个想法是为了能够创建排名,以按字符串的降序对每一行进行排序,并按升序对整数进行排名,这将是输出:

    Rank String  Integer
0      2      c        4           
1      2      c        4         
2      2      c        4          
3      4      c        6          
4      5      b        1          
5      6      b        3         
6      7      a        1            
7      8      a        2            
8    9.5      a        3            
9    9.5      a        3        

到目前为止,这是我设法做到的,但是我在共享排名时如何生成'平均'方面遇到麻烦。

df['concat_values'] = df['String'] + df['Integer'].astype(str)  
df = df.sort_values(['String','Integer'],ascending=[False,True])
df = df.reset_index(drop=True).reset_index()
df['repeated'] = df.groupby('concat_values')['concat_values'].transform('count')
df['pre_rank'] = df['index'] + 1
df = df.sort_values('pre_rank')
df = df.drop('index',axis=1)
print(df)
  String  Integer concat_values  repeated  pre_rank
0      c        4            c4         3         1
1      c        4            c4         3         2
2      c        4            c4         3         3
3      c        6            c6         1         4
4      b        1            b1         1         5
5      b        3            b3         1         6
6      a        1            a1         1         7
7      a        2            a2         1         8
8      a        3            a3         2         9
9      a        3            a3         2        10

[我曾考虑过使用某种过滤或公式,以便当repeated列的值大于1时,pre_rank将获得应用的函数,该函数返回平均值,但该函数无法针对所有行进行通用化,它适用于第一个,但第二个将产生更高的值(因为pre_rank现在具有更高的值)。我相信我只是错过了完成它的最后一步,但无法解决。谢谢!

python pandas rank
1个回答
3
投票
[sort +ngroup+ rank

2
投票
我的方法:
© www.soinside.com 2019 - 2024. All rights reserved.