python - pandas 数据框中一列中的数字分组

标签 python pandas

这是我的数据框:

import pandas as pd

df = pd.DataFrame(
    {
        'a': [0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
        'b': [0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0]
    }
)

这就是我想要的分组方式:

2   1  1
3   0  1
4   0  1
5   0  1
6   0  0
7   0  0

9   1  0
10  0  1

13  1  1
14  0  1
15  0  1
16  0  0
17  0  1

我想根据 b 列的值对该数据框进行分组。首先要做的是找到 a 列中的 1。然后我想继续,只要 b 列中有 0,然后也获取 0 之后的行。 如果 a 中的值为 1,b 中的值为 0,我只想继续一行。 基本上我想在 b 列中出现 0 时立即停止,然后继续该 0 之后的一行。

我已经尝试过这两个帖子:post1 , post2但仍然有问题需要解决。

我尝试按以下方式对它们进行分组:df.b.diff().cumsum()但它没有给我我想要的东西

最佳答案

使用cumsum创建用于过滤/分组的辅助系列,然后使用 bool 掩码对每个组进行子过滤:

group = df['a'].cumsum()

for k, g in df[group>0].groupby(group):
    # drop rows 2 places after the first 0
    m = g['b'].ne(0).cummin().shift(2, fill_value=True)
    print(g[m])

输出:

   a  b
2  1  1
3  0  1
4  0  1
5  0  1
6  0  0
7  0  0

    a  b
9   1  0
10  0  1

    a  b
13  1  1
14  0  1
15  0  1
16  0  0
17  0  1

作为单个数据帧:

运行上述命令并concat,或者:

group = df['a'].cumsum()
m = df['b'].ne(0).groupby(group).apply(lambda x: x.cummin().shift(2, fill_value=True))

out = df[group.gt(0)&m]

输出:

    a  b
2   1  1
3   0  1
4   0  1
5   0  1
6   0  0
7   0  0
9   1  0
10  0  1
13  1  1
14  0  1
15  0  1
16  0  0
17  0  1

关于python - pandas 数据框中一列中的数字分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73104011/

相关文章:

python - 在Python中调用上下文管理器

python - 使用加法 (+) 运算符连接系列?

python - [Pandas]如何获取每组top-n%的记录

python - 如何使用 django paginator 在页面上拆分 DataFrame (pandas)?

python Pandas : Wide format to long format but differently - similar to reverse dummy columns

python - 使用 turbodbc 从 Python 访问 Linux 上的 Postgres

python - haproxy 背后扭曲的应用程序

python - 在 zeromq/python 中使用 pyobj 子函数时设置主题

python - 如何创建一个返回值的异步任务?

python - 如果 df2 中不存在数据,则从 df1 获取数据