我试图根据ID和年份标记行,如果ID出现在年份[201720182019]中,而在[2020202022]中出现not appeared,则需要将其标记为1或0.

df1 = pd.DataFrame({'ID': ['AX1', 'Ax1', 'AX1','AX1','AX1','AX1','AX2','AX2','AX2','AX3','AX3','AX4','AX4','AX4'],'year':[2017,2018,2019,2020,2021,2022,2019,2020,2022,2019,2020,2017,2018,2019]})

     ID  year
0   AX1  2017
1   Ax1  2018
2   AX1  2019
3   AX1  2020
4   AX1  2021
5   AX1  2022
6   AX2  2019
7   AX2  2020
8   AX2  2022
9   AX3  2019
10  AX3  2020
11  AX4  2017
12  AX4  2018
13  AX4  2019

预期输出:

     ID  year  label
0   AX1  2017      0
1   Ax1  2018      0
2   AX1  2019      0
3   AX1  2020      0
4   AX1  2021      0
5   AX1  2022      0
6   AX2  2019      0
7   AX2  2020      0
8   AX2  2022      0
9   AX3  2019      0
10  AX3  2020      0
11  AX4  2017      1
12  AX4  2018      1
13  AX4  2019      1

在上述示例中,ID:AX4标记为1,因为它是第一组年份(201720182019)中出现的唯一ID,第二组年份(2020202022)中出现的唯一ID.

我如何做到这一点?

推荐答案

使用

df1 = pd.DataFrame({'ID': ['AX1', 'AX1', 'AX1','AX1','AX1','AX1','AX2','AX2','AX2','AX3','AX3','AX4','AX4','AX4'],'year':[2017,2018,2019,2020,2021,2022,2019,2020,2022,2019,2020,2017,2018,2019]})
# find group level labels by checking if all of 2017-19 and none of 2020-22 exist for each ID
gr_lbl = df1.groupby('ID')['year'].apply(lambda g: {2017,2018,2019}.issubset(g) and not bool({2020,2021,2022}.intersection(g)))*1
# map group level labels to ID
df1['labels'] = df1.ID.map(gr_lbl)
df1

enter image description here

Python相关问答推荐

是否有使用纯霍夫曼编码的现代图像格式?

判断两极中N(N 2)列水平是否相等

Polars Dataframe:如何按组删除交替行?

如果索引不存在,pandas系列将通过索引获取值,并填充值

无法使用equals_html从网址获取全文

使用plotnine和Python构建地块

使用Keras的线性回归参数估计

如何在msgraph.GraphServiceClient上进行身份验证?

Django管理面板显示字段最大长度而不是字段名称

Pandas 滚动最接近的价值

如何将双框框列中的成对变成两个新列

处理(潜在)不断增长的任务队列的并行/并行方法

沿着数组中的轴计算真实条目

查找两极rame中组之间的所有差异

输出中带有南的亚麻神经网络

Python库:可选地支持numpy类型,而不依赖于numpy

Telethon加入私有频道

如何在python polars中停止otherate(),当使用when()表达式时?

在vscode上使用Python虚拟环境时((env))

如何在Python中获取`Genericums`超级类型?