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)
您可以首先使用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”会根据数据帧的原始顺序生成。