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

标签 python python-3.x pandas pandas-groupby

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

   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/

相关文章:

python - python 打开文本文件读取并求平均值

javascript - 你如何在 python 的 Mechanize 中禁用 javascript?

python-3.x - 使用 iterrow 更新数据框

c - 如何使用 ctypes 将字符串数组从 python 传递到 C 并在 C 中修改该数组值

python - Pandas:合并数据框中的重复字符串

python - 如何在使用 QSplitter 时固定一个小部件

python - 如何模拟点击元素?

pandas - 选择可以在列表中找到数字的行

python - 使用同一数据框中其他两列的值从一列创建二维列表

python - marshmallow - 序列化时如何将架构属性映射到另一个键?