使用排名函数(或其他函数)打破平局 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
您可以将 rank
与 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.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' 会根据数据帧的原始顺序产生。
我有以下数据框:
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
您可以将 rank
与 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.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' 会根据数据帧的原始顺序产生。