Python 使用秩函数(或其他函数)打破联系

Python 使用秩函数(或其他函数)打破联系,python,pandas,dataframe,numpy,rank,Python,Pandas,Dataframe,Numpy,Rank,我有以下数据帧: 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'] = d

我有以下数据帧:

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:

输出:

   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
   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
您可以使用rank with method='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
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
   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
详情:


首先,按权重降序对数据帧进行排序,然后使用rank with方法First on Score,这将根据数据帧的排序顺序打破关系。由于pandas进行内部数据对齐,因此根据数据帧的原始顺序为新列“Score_Rank”赋值。

您能简要描述一下这是怎么做的吗?@tjjudge它实现了您想要的功能:首先按分数排序,如果分数相等,则按权重排序,最后,使用cumcount相应地枚举行。因此,如果分数和权重相等,那么这些行的排名应该不同,即一个为3级,另一个为4级,或者两者相同,因此都是3级?一个为3级,另一个为4级。如果两者都是平手,我们会随机选择排名——只在单独得分排名之后,然后得分+权重。