pandas - 仅按出现次数创建排名

问题描述 投票:0回答:2

我有一个这样的数据框:

用户 项目 旧排名
0 0 1
0 1 3
1 0 1
1 1 2
1 2 5

这个 oldRanking 是每个用户的项目排名。它应该是完整的数字,但我不得不使用 df.drop_duplicates(subset=['user','item']) 删除多次出现的项目并消耗排名位置。

(例如,有一行 user 0 item 0 oldRanking 2,和 2 行 user 1 item 1 oldRanking 3 & 4)

我想创建一个新的列,newRanking 是这样的:

用户 项目 旧排名 新排名
0 0 1 1
0 1 3 2
1 0 1 1
1 1 2 2
1 2 5 3

根据它的出现来分配排名。 我尝试了 df.groupby(['user','item'])['oldRanking'].rank(ascending=True) 但它只为每一列返回 1.0 值。

我应该如何实现上面的 newRanking 列?

python pandas duplicates ranking
2个回答
0
投票

pandas.DataFrame.groupby
不一定需要聚合函数,它也可以用于按数据帧的子组执行操作。在这种情况下,您有兴趣根据用户组创建累积计数:

df['newRanking']=df.groupby('user').cumcount()+1

0
投票

这是使用

rank()
来做到这一点的方法:

df['newRanking'] = df.groupby('user')['item'].rank(method='min').convert_dtypes()

输出:

   user  item  oldRanking  newRanking
0     0     0           1           1
1     0     1           3           2
2     1     0           1           1
3     1     1           2           2
4     1     2           5           3
© www.soinside.com 2019 - 2024. All rights reserved.