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级。如果两者都是平手,我们会随机选择排名——只在单独得分排名之后,然后得分+权重。