使用排名函数(或其他函数)打破平局 PYTHON

Break ties using rank function (OR other function) PYTHON

我有以下数据框:

ID Name    Weight Score  
1  Amazon    2    11     
1  Apple     4    10     
1  Netflix   1    10     
2  Amazon    2    8      
2  Apple     4    8      
2  Netflix   1    5     

目前我有一个看起来像这样的代码

#add weight and score column
df['Rank'] = df['Weight'] + df['Score']
#create score rank on ID column
df['Score_Rank'] = df.groupby('ID')['Rank'].rank("first", ascending = False) 

这段代码没有给出我想要的。

我想在分数上排名第一,不包括体重。然后通过添加权重列来打破排名中的任何平局。 如果在添加权重列后还有其他关系,则排名将通过随机选择。

我认为 if 语句可以在这种情况下起作用,只是不确定如何。

预期输出:

ID Name    Weight Score  Score_Rank
1  Amazon    2    11     1
1  Apple     4    10     2
1  Netflix   1    10     3
2  Amazon    2    8      2
2  Apple     4    8      1
2  Netflix   1    5      3   

试试 cumcount:

df['Score_Rank'] = (df.sort_values(['Score','Weight'])
                      .groupby(['ID']).cumcount(ascending=False)+1
                   )

输出:

   ID     Name  Weight  Score  Score_Rank
0   1   Amazon       2     11           1
1   1    Apple       4     10           2
2   1  Netflix       1     10           3
3   2   Amazon       2      8           2
4   2    Apple       4      8           1
5   2  Netflix       1      5           3

您可以将 rankmethod='first' 一起使用,并先进行一些预排序:

df['Score_Rank'] = (df.sort_values('Weight', ascending=False)
                      .groupby(['ID'])['Score']
                      .rank(method='first', ascending=False)
                   )

输出:

   ID     Name  Weight  Score  Score_Rank
0   1   Amazon       2     11         1.0
1   1    Apple       4     10         2.0
2   1  Netflix       1     10         3.0
3   2   Amazon       2      8         2.0
4   2    Apple       4      8         1.0
5   2  Netflix       1      5         3.0

详情:

首先,按权重降序对数据框进行排序,然后在 Score 上使用 rank with 方法,这将根据数据框的排序顺序打破平局。并且因为 pandas 进行内部数据对齐,分配给新列 'Score_Rank' 会根据数据帧的原始顺序产生。