我有一个这样的数据框:
用户 | 项目 | 旧排名 |
---|---|---|
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 列?
pandas.DataFrame.groupby
不一定需要聚合函数,它也可以用于按数据帧的子组执行操作。在这种情况下,您有兴趣根据用户组创建累积计数:
df['newRanking']=df.groupby('user').cumcount()+1
这是使用
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