python - 计算列中连续真实值的数量

标签 python pandas boolean cumsum

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

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]})

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

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

我想要的是计算列中连续的 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()生成一个分组器,它将对每个连续的零/一组进行分组:

# 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

关于python - 计算列中连续真实值的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70353092/

相关文章:

python - Vim 语法文件 - 函数名末尾加引号 [dg 编程语言]

python - 将文本文件转换为图形

pandas - 使用 pandas 加载波士顿数据集

python - 基于另一列过滤 pandas 数据框

python - 如何使用 numpy 有效地按值展开矩阵?

python - 根据列中的值从 Pandas 数据框中删除行

python - Pandas 在多级数据帧上 applymap

python - 将函数应用于 python-pandas 中的数据框时出现 ValueError

scheme - PLT 方案菜鸟 : Boolean and/or aren't procedures?

Python:如何在数组中以 "n"为步长选择性地切换 boolean 元素?