我有一个如下所示的数据框:
id date isActive
0 1 2019-01-01 0
1 1 2019-01-02 1
2 1 2019-01-03 1
3 1 2019-01-04 0
4 1 2019-01-05 0
5 2 2019-01-01 0
6 2 2019-01-02 1
7 2 2019-01-03 0
8 2 2019-01-04 1
9 2 2019-01-05 0
我想过滤掉每个 ID 的所有非事件 (isActive=0) 行,除非该 ID 的最新行是非事件的。之后,我的数据框应该如下所示:
id date isActive
0 1 2019-01-02 1
1 1 2019-01-03 1
2 1 2019-01-04 0
3 1 2019-01-05 0
4 2 2019-01-02 1
5 2 2019-01-04 1
6 2 2019-01-05 0
我认为我应该尝试保留所有事件行,以及与每个 id 的最后一组连续 isActive 值关联的行。为此,我尝试创建一个标志来指示 isActive 变量何时更改,然后尝试获取每个组的大小:
df['flag'] = df.groupby(['id', df['isActive'].eq(1).cumsum()])['isActive'].transform('size')
然后,我尝试使用 apply
和 tail
来保留满足上述条件的每一行,但我意识到我不能只访问 标志 最后一列的值:
df.groupby(['ID']).apply(lambda x: (x['Status'].eq(2)) | (x['Status'].tail(x['flag'])))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我想我可能想多了这个问题。有没有更好的方法?
最佳答案
检查 isActive
是否为 0 并从组内的底部开始累积乘积。这将为您提供最后一个 0 连胜(如果有)的 True
。将其与所有 1
的行结合起来,您就得到了总掩码。
# Assumes sorted by date within each id
m = (df['isActive'].eq(0)[::-1].groupby(df['id']).cumprod().sort_index()
| df['isActive'].eq(1))
df[m]
id date isActive
1 1 2019-01-02 1
2 1 2019-01-03 1
3 1 2019-01-04 0
4 1 2019-01-05 0
6 2 2019-01-02 1
8 2 2019-01-04 1
9 2 2019-01-05 0
关于python - 有没有办法为 pandas groupby 对象保留每个组的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59995225/