如何按列分组并将重复值指定为 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
我有一个数据框:-
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