如何按列分组并将重复值指定为 1,将原始值指定为 0

How to group by a column and give duplicate values as 1 and original values as 0

我有一个数据框:-

         Date bikes
0   28/12/2021  zw12
1   28/12/2021  zw11
2   28/12/2021  zw13
3   28/12/2021  zw14
4   26/12/2021  zw11
5   25/12/2021  zw11
6   23/12/2021  zw12
7   20/12/2021  zw12
8   19/12/2021  zw11
9   22/05/2020  zw11
10  24/05/2020  zw12

现在我想根据列 'Date' 中的最新日期按列 'bikes' 进行分组。因此,为此我创建了一个列 'Rank',它将最新记录分配为 1,将 old/duplicates 记录分配为 2。我尝试按以下方式执行此操作:-

df_rank=df.assign(rank=df.groupby('bikes')['Date'].transform(lambda x: x.rank())) \
  .sort_values('Date',ascending = False)
print(df_rank)
          Date bikes  rank
0   28/12/2021  zw12   4.0
1   28/12/2021  zw11   5.0
2   28/12/2021  zw13   1.0
3   28/12/2021  zw14   1.0
4   26/12/2021  zw11   4.0
5   25/12/2021  zw11   3.0
10  24/05/2020  zw12   3.0
6   23/12/2021  zw12   2.0
9   22/05/2020  zw11   2.0
7   20/12/2021  zw12   1.0
8   19/12/2021  zw11   1.0

如您所见,rank 函数没有按照我的意愿进行分配。我以错误的方式使用它吗? 我想要在 'Rank'.

列中包含 0 的 latest/original 记录和包含 1 的 duplicate/old 记录

期望的输出:-

            Date bikes  rank
    0   28/12/2021  zw12   1.0   
    1   28/12/2021  zw11   1.0
    2   28/12/2021  zw13   1.0
    3   28/12/2021  zw14   1.0
    4   26/12/2021  zw11   2.0
    5   25/12/2021  zw11   2.0
    10  24/05/2020  zw12   2.0
    6   23/12/2021  zw12   2.0
    9   22/05/2020  zw11   2.0
    7   20/12/2021  zw12   2.0
    8   19/12/2021  zw11   2.0

假设 Date 列是 datetime 类型,那么:

from itertools import count
from collections import defaultdict

d = defaultdict(count)

df = df.sort_values(by="Date", ascending=False)
df["rank"] = (
    df.groupby("Date", sort=False)["bikes"]
    .transform(lambda x: [next(d[v]) for v in x])
    .gt(0)
    .astype(int)
)
print(df)

打印:

         Date bikes  rank
6  2021-12-28  zw12     0
7  2021-12-28  zw11     0
8  2021-12-28  zw13     0
9  2021-12-28  zw14     0
10 2021-12-26  zw11     1
0  2021-12-25  zw11     1
1  2021-12-23  zw12     1
2  2021-12-20  zw12     1
3  2021-12-19  zw11     1
5  2020-05-24  zw12     1
4  2020-05-22  zw11     1