![](/img/trans.png)
[英]Efficiently calculate non-consecutive number of appereances of element in data frame
[英]How to effciently calculate non-consecutive number of appereances of element in list?
所以我试图找出某个元素没有连续出现在列表中的次数。 我的意思是:
list = [10,10,10,11,12,10,12,14,10,10,10]
element_searched = 10
=> expected_output = 3
所以这意味着 10 在列表中出现了 3 次。
到目前为止,我的代码似乎有效:
elements = [11, 10, 12]
row = [10,10,10,10,10,10,10,10,10,11,11,11,11,11,10,10,10,10,12,12,12,12,12,11,11,11,11,12,12,12,12,10]
element_on = False
for element in elements:
sequence = 0
for i in range(len(row)):
if element == row[i] and element_on==False:
sequence += 1
element_on = True
elif element==row[i] and element_on==True:
pass
elif element != row[i] and element_on==True:
element_on = False
#
elif element != row[i] and element_on == False:
element_on = False
#
print(f"For element {element} the number ob sequences is: {sequence} ")
我得到了所需的输出,但我想知道是否有更优雅,尤其是更快的方法。
尝试这个:
row = [10,10,10,10,10,10,10,10,10,11,11,11,11,11,10,10,10,10,12,12,12,12,12,11,11,11,11,12,12,12,12,10]
sr = pd.Series(row, name = "x")
sr[sr.groupby(sr.shift(-1).bfill(0).ne(sr)).transform('cumcount')==1].value_counts()
输出:
10 3
12 2
11 2
第一列是x
值,第二列是序列数。
更紧凑、更快捷的方式:
from itertools import groupby
pd.Series([k for k, g in groupby(row)]).value_counts()
另一种解决方案:
np.unique([k for k, g in groupby(row)], return_counts=True)
结果:
(array([10, 11, 12]), array([3, 2, 2], dtype=int64))
或者使用np.bincount
:
np.bincount([k for k, g in groupby(row)])
但输出会略有不同:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2], dtype=int64)
我想这就是你想要的。 按相似元素对列表进行分组,然后对计数求和
import itertools
element_searched = 10
expected_output = sum([i.count(element_searched) for i in itertools.groupby(list)])
3
我会使用一个简单的字典:
row = [10,10,10,10,10,10,10,10,10,11,11,11,11,11,10,10,10,10,12,12,12,12,12,11,11,11,11,12,12,12,12,10]
counter = {}
last_item = None
for item in row:
if last_item != item:
counter[item] = counter.get(item, 0) + 1
last_item = item
print (counter)
一些可以指导您的想法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.