【问题标题】:count sets of consecutive true values in a column计算列中连续真值的集合
【发布时间】:2022-01-18 00:19:37
【问题描述】:

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

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

我想要的是计算列中连续的 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”等工具,但老实说,我不知道如何解决它。提前致谢

【问题讨论】:

    标签: python pandas boolean cumsum


    【解决方案1】:

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

    让我们将 Series 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')
    

    列表看起来像

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

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

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

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

    【讨论】:

      【解决方案2】:

      您可以使用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
      

      因此,按该 grouper 分组,计算总和,将零替换为 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-10
        • 2017-05-15
        • 2019-09-01
        • 2020-03-05
        • 1970-01-01
        • 1970-01-01
        • 2021-05-08
        相关资源
        最近更新 更多