假设我有这个数据帧
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
,我认为这是第二种选择。
-
如果排名逻辑是(a(,你可以简单地写
df["id_rank"] = df.date.rank(method="dense").astype("int")
method="dense"
参数按唯一值进行排名,而不是像正常的rank()
函数返回的那样作为排序结果的索引。 -
如果排名逻辑是(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开始。