子集熊猫数据框达到条件时第一次
问题描述:
我没有什么运气来完成一项任务,我想要一个熊猫数据框的子集高达一个值,并按他们的ID分组。在实际的数据集,我有几个列在 '身份证' 和 '状态'子集熊猫数据框达到条件时第一次
之间。例如:
d = {'id': [1,1,1,1,1,1,1,2,2,2,2,2,2,2], 'status': [0,0,0,0,1,1,1,0,0,0,0,1,0,1]}
df = pd.DataFrame(data=d)
id status
0 1 0
1 1 0
2 1 0
3 1 0
4 1 1
5 1 1
6 1 1
7 2 0
8 2 0
9 2 0
10 2 0
11 2 1
12 2 0
13 2 1
所需的子集是:
id status
0 1 0
1 1 0
2 1 0
3 1 0
4 1 1
5 2 0
6 2 0
7 2 0
8 2 0
9 2 1
答
让我们尝试groupby
+ cumsum
:
df = df.groupby('id', group_keys=False)\
.apply(lambda x: x[x.status.cumsum().cumsum().le(1)])\
.reset_index(drop=1)
df
id status
0 1 0
1 1 0
2 1 0
3 1 0
4 1 1
5 2 0
6 2 0
7 2 0
8 2 0
9 2 1
下面是执行groupby
创建蒙用作索引器替代:
df = df[df.status.eq(1).groupby(df.id)\
.apply(lambda x: x.cumsum().cumsum().le(1))]\
.reset_index(drop=1)
df
id status
0 1 0
1 1 0
2 1 0
3 1 0
4 1 1
5 2 0
6 2 0
7 2 0
8 2 0
9 2 1
谢谢@COLDSPEED。你能解释两次使用.cumsum()。cumsum()吗?我看到输出的差异,但不完全理解它。 –
@DarenEiri我不得不在你的MCVE上表扬你,因为我意识到这是必要的。说'status'是'0 0 0 1 0 1'。我需要前4行,对吗?第一个'cumsum'给出'0 0 0 1 1 2'。基于'> = 1'(或'le(1)')条件,它会给我前5行,而我想要4。第二个'cumsum'给我'0 0 0 1 2 4',现在'le(1)'只给出我想要的前4行。 –
@COLDSPEED。谢谢你的解释。我在无数次失败的尝试中使用了'cumsum'方法,但是使用'le(1)'的第二个'cumsum'则有所不同! –