这是我的数据框:
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/