gpt4 book ai didi

python - 有没有办法为 pandas groupby 对象保留每个组的子集?

转载 作者:行者123 更新时间:2023-12-01 14:38:34 25 4
gpt4 key购买 nike

我有一个如下所示的数据框:

   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')

然后,我尝试使用 applytail 来保留满足上述条件的每一行,但我意识到我不能只访问 标志 最后一列的值:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com