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

tj *_*ge 3 python numpy rank dataframe pandas

我有以下数据框:

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     
Run Code Online (Sandbox Code Playgroud)

目前我有一个代码,如下所示

#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) 
Run Code Online (Sandbox Code Playgroud)

这段代码并没有给我我想要的东西。

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

我认为 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   
Run Code Online (Sandbox Code Playgroud)

Sco*_*ton 6

您可以首先使用rankwith进行一些预排序:method='first'

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

输出:

   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
Run Code Online (Sandbox Code Playgroud)

细节:

首先,按权重降序对数据帧进行排序,然后在 Score 上使用排名方法,这将根据数据帧的排序顺序打破平局。因为,pandas 进行内部数据对齐,所以分配给新列“Score_Rank”会根据数据帧的原始顺序生成。