pandas groupby连续的数字和它后面的一行,然后检查每个组的列的第一个值

twh00eeo  于 6个月前  发布在  其他
关注(0)|答案(2)|浏览(98)

这是post的扩展。
这是我的博客:

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

字符串
而我所期望的结果,就是将它们分组:

a  b
4   1  1
5   0 -1

10  1  1
11  1  1
12  0 -1


基本上,我想将它们按1和一行后的条纹在列a中结束的位置进行分组。这个answer可以做到这一点:

g = df.loc[::-1, 'a'].eq(0).cumsum()

out = [g for _,g in df.groupby(g, sort=False) if len(g)>1]


但是现在我想检查b中每个组的第一个值是否为1。
我不知道什么是检查b的第一个值的最佳方法。这是我尝试过的,但我不确定它是否在任何情况下都有效。

groups = df.groupby(g).filter(lambda x: x.b.iloc[0] == 1)


我经历过一些情况,代码在一个例子中工作,但它并不适用于不同条件下的每一种情况,所以我想仔细检查我的代码。

jljoyd4f

jljoyd4f1#

验证码

g = df['a'].eq(0).cumsum().sub(df['a'].eq(0)) # grouper
cond1 = df.groupby(g)['b'].transform('first').eq(1) # first of colb is 1
cond2 = df.groupby(g)['b'].transform('count').gt(1) # len of group  is greater than 1
out = [d for _, d in df[cond1 & cond2].groupby(g)] # filter by cond1 and cond2

字符串
出来

[   a  b
 4  1  1
 5  0 -1,
     a  b
 10  1  1
 11  1  1
 12  0 -1]

4sup72z8

4sup72z82#

另一种方法,使用.ffilllimit=

mask = (df["a"] != df["a"].shift()).cumsum()
mask[df["a"] != 1] = np.nan
mask = mask.ffill(limit=1)

for _, g in df.groupby(mask):
    if g["b"].iat[0] != 1:
        continue
    print(g)
    print()

字符串
印刷品:

a  b
4  1  1
5  0 -1

    a  b
10  1  1
11  1  1
12  0 -1

相关问题