如何计算一列熊猫DataFrame中的一组

在数据框中我有列标志,我想在列中计算 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]}) 


守着一只汪
浏览 113回答 4
4回答

aluckdog

使用没有任何附加/连接的 NumPy,再次为了性能 -a = df.flag.valuesout = (a[1:]>a[:-1]).sum() + (a[0]==1)解释:我们寻找下一个大于前一个的元素。如果满足,则表示一个岛/组的开始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 solnIn [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 postIn [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 solnIn [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 solnIn [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)一般情况(当可能有除 0 和 1 以外的数字时)该解决方案将通过获取要搜索的数字掩码(1此处)并对其进行操作来修改为这些方面的内容 -a = df.flag.valuesm = a==1out = (m[1:] & ~m[:-1]).sum() + m[0]

一只甜甜圈

ne想法是通过不等于比较连续组Series.shift并仅过滤具有以下内容的组1:a = (df['flag'].ne(df['flag'].shift()) & df['flag'].eq(1)).sum()print (a)4df_out=pd.DataFrame({'groups_of_one_count':[a]}) print (df_out)   groups_of_one_count0                    4详情:print (df.assign(consec=df['flag'].ne(df['flag'].shift()),                 eq1 = df['flag'].eq(1),                 chained = (df['flag'].ne(df['flag'].shift()) & df['flag'].eq(1))       ))    flag  consec    eq1  chained0      1    True   True     True1      1   False   True    False2      0    True  False    False3      1    True   True     True4      0    True  False    False5      1    True   True     True6      1   False   True    False7      0    True  False    False8      1    True   True     True9      1   False   True    False10     1   False   True    False

慕尼黑8549860

使用纯 numpy 可以提高性能:(np.diff(np.append(df.flag.values,0)) == -1).sum()思路1:统计数据从到跳转的次数0。我们使用为系列以 结尾的情况np.append添加尾随,以便包含最后一个块。01

开满天机

首先,我们选择index不等于0,并找到索引diff,如果差异不继续(这里不是eq 1),那就是不同的组:df[df.flag.ne(0)].index.to_series().diff().ne(1).sum() 4
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python