计算列中连续真值的集合

count sets of consecutive true values in a column

假设我有一个数据框如下:

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

然后,我将其转换为布尔形式:

df.eq(1)
Out[213]: 
        A
0    True
1    True
2    True
3    True
4    True
5   False
6   False
7    True
8    True
9   False
10   True
11   True
12   True
13   True
14   True
15  False
16  False
17  False
18  False
19  False
20   True
21   True

我想要的是计算列中连续的真值集。在此示例中,输出将是:

    df
Out[215]: 
    A  count
0   1    5.0
1   1    2.0
2   1    5.0
3   1    2.0
4   1    NaN
5   0    NaN
6   0    NaN
7   1    NaN
8   1    NaN
9   0    NaN
10  1    NaN
11  1    NaN
12  1    NaN
13  1    NaN
14  1    NaN
15  0    NaN
16  0    NaN
17  0    NaN
18  0    NaN
19  0    NaN
20  1    NaN
21  1    NaN

我的进步是通过使用工具 'groupby' 和 'cumsum' 但老实说,我不知道如何解决它。提前致谢

您可以使用 df['A'].diff().ne(0).cumsum() 生成一个石斑鱼,它将每个连续的 zeros/ones 组分组:

# A side-by-side comparison:
>>> pd.concat([df['A'], df['A'].diff().ne(0).cumsum()], axis=1)
    A  A
0   1  1
1   1  1
2   1  1
3   1  1
4   1  1
5   0  2
6   0  2
7   1  3
8   1  3
9   0  4
10  1  5
11  1  5
12  1  5
13  1  5
14  1  5
15  0  6
16  0  6
17  0  6
18  0  6
19  0  6
20  1  7
21  1  7

因此,按那个石斑鱼分组,计算总和,用 NaN + dropna 替换零,并重置索引:

df['count'] = df.groupby(df['A'].diff().ne(0).cumsum()).sum().replace(0, np.nan).dropna().reset_index(drop=True)

输出:

>>> df
    A    B
0   1  5.0
1   1  2.0
2   1  5.0
3   1  2.0
4   1  NaN
5   0  NaN
6   0  NaN
7   1  NaN
8   1  NaN
9   0  NaN
10  1  NaN
11  1  NaN
12  1  NaN
13  1  NaN
14  1  NaN
15  0  NaN
16  0  NaN
17  0  NaN
18  0  NaN
19  0  NaN
20  1  NaN
21  1  NaN

我提出了一种使用拆分字符串函数的替代方法。

让我们将系列 df.A 转换为字符串,然后将其拆分为零。

df = pd.DataFrame({'A':[1,1,1,1,1,0,0,1,1,0,1,1,1,1,1,0,0,0,0,0,1,1]})
ll = ''.join(df.A.astype('str').tolist()).split('0')

列表 ll 看起来像

print(ll)
['11111', '', '11', '11111', '', '', '', '', '11']

现在我们计算每个字符串的长度并将其放入列表

[len(item) for item in ll if len(item)>0]

如果系列不是太长,这是可行的。