如何在不属于组本身的组之间对值应用排名

  • 本文关键字:应用 之间 不属于 python pandas
  • 更新时间 :
  • 英文 :


假设我有这个数据帧

date        id
0   2019-10-01  303
1   2019-10-01  303
2   2019-10-01  404
3   2019-10-01  404
4   2019-10-02  303
5   2019-10-02  303
6   2019-10-02  404
7   2019-10-02  404

我想应用排名,这样我就有了这个数据帧

date        id   id_rank
0   2019-10-01  303  1
1   2019-10-01  303  1
2   2019-10-01  404  1
3   2019-10-01  404  1
4   2019-10-02  303  2
5   2019-10-02  303  2
6   2019-10-02  404  2
7   2019-10-02  404  2

我尝试了使用此代码的pandas.groupby.rank()

df["id_rank"] = df.groupby(["index_date", "id"])["id"].rank(method="first")

这让我更接近想要的结果

date        id   id_rank
0   2019-10-01  303  1
1   2019-10-01  303  1
2   2019-10-01  404  1
3   2019-10-01  404  1
4   2019-10-02  303  1
5   2019-10-02  303  1
6   2019-10-02  404  1
7   2019-10-02  404  1

我想根据日期进行排名。如果id在第一天在数据帧中注册,则它的级别为1,如果在第二天再次注册,则其级别为2,依此类推;如果id在第三天上注册,则排名3

排名逻辑并不完全清楚。有两种解释方式:(a(所有日期相同的东西都有相同的排名,或者(b(日期按id排序。给定名称id_rank,我认为这是第二种选择。

  1. 如果排名逻辑是(a(,你可以简单地写

    df["id_rank"] = df.date.rank(method="dense").astype("int")
    

    method="dense"参数按唯一值进行排名,而不是像正常的rank()函数返回的那样作为排序结果的索引。

  2. 如果排名逻辑是(b(,您可以使用与第一种方法类似的想法,但在排名之前,您首先按id分组:

    df["id_rank"] = df.groupby("id").date.rank(method="dense").astype("int")
    

为了说明差异,假设您有数据帧

date   id
0  2019-10-01  303
1  2019-10-01  404
2  2019-10-01  404
3  2019-10-02  303
4  2019-10-02  404
5  2019-10-02  405
6  2019-10-03  404
7  2019-10-03  405

那么两个不同选项给出的结果将是:

date   id  option_a  option_b
0 2019-10-01  303         1         1
1 2019-10-01  404         1         1
2 2019-10-01  404         1         1
3 2019-10-02  303         2         2
4 2019-10-02  404         2         2
5 2019-10-02  405         2         1
6 2019-10-03  404         3         3
7 2019-10-03  405         3         2

关键区别在于id405的秩是从1开始还是从2开始。

最新更新