如何计算一列熊猫数据帧中的一组

Edw*_*ard 4 python pandas pandas-groupby

在数据框中我有列标志,我想计算列中的 1 组

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


df_out=pd.DataFrame({'groups_of_one_count':[4]}) 
Run Code Online (Sandbox Code Playgroud)

Div*_*kar 5

使用 NumPy 没有任何附加/连接,再次为了性能 -

a = df.flag.values
out = (a[1:]>a[:-1]).sum() + (a[0]==1)
Run Code Online (Sandbox Code Playgroud)

解释:我们寻找下一个元素大于前一个元素。如果满足,则表示 的岛/群的开始1s。我们只是得到总和作为最终输出。对于极端情况,当这样的组从第一个元素开始时,我们单独捕获它。

给定样本的时间按比例放大10000x-

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

In [65]: df = pd.concat([df]*10000)

# @Quang Hoang's soln
In [66]: %timeit (np.diff(np.append(df.flag.values,0)) == -1).sum()
362 µs ± 26.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# From this post
In [67]: %%timeit   
    ...: a = df.flag.values
    ...: out = (a[1:]>a[:-1]).sum() + (a[0]==1)
191 µs ± 5.4 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

# @jezrael's soln
In [68]: %timeit (df['flag'].ne(df['flag'].shift()) & df['flag'].eq(1)).sum()
1.39 ms ± 8.86 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# @YOBEN_S's soln
In [69]: %timeit df[df.flag.ne(0)].index.to_series().diff().ne(1).sum()
2.92 ms ± 209 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Run Code Online (Sandbox Code Playgroud)

一般情况(当可能有除 0 和 1 以外的数字时)

通过获取要搜索的数字掩码(1此处)并对其进行操作,该解决方案将修改为这些方面的内容-

a = df.flag.values
m = a==1
out = (m[1:] & ~m[:-1]).sum() + m[0]
Run Code Online (Sandbox Code Playgroud)