Python 如何计算一个值重复最小次数的次数
我有一个有两列的数据框。第一个是时间,从1开始算起 重要的是一堆1和0。我想知道一个特定的n次重复多少次。例如,假设我有100个随机放置的1和0的值,我想知道我有多少次在一行中至少有5个1。这意味着我想知道它重复5、6、7次的次数,或者更多的次数 以前有人做过类似的事情吗?试试:Python 如何计算一个值重复最小次数的次数,python,pandas,Python,Pandas,我有一个有两列的数据框。第一个是时间,从1开始算起 重要的是一堆1和0。我想知道一个特定的n次重复多少次。例如,假设我有100个随机放置的1和0的值,我想知道我有多少次在一行中至少有5个1。这意味着我想知道它重复5、6、7次的次数,或者更多的次数 以前有人做过类似的事情吗?试试: np.random.seed(1234) df=pd.DataFrame(np.random.choice([0,1], 100)) (df.groupby(df[0].ne(1).cumsum().where(df
np.random.seed(1234)
df=pd.DataFrame(np.random.choice([0,1], 100))
(df.groupby(df[0].ne(1).cumsum().where(df[0] == 1)).count() > 4).sum().values[0]
输出:
2
不那么优雅的方式
df['diff'] = df['Column'].diff()
df = df.fillna(0)
repeats = 0
y = 0
for x in df.itertuples():
if x.diff == 0:
y+=1
else:
if y >= 5:
repeats += 1
y = 0
我使用的是
itertools.groupby
,带有np.unique
import itertools
x,y=np.unique([tuple(y) for x , y in itertools.groupby(df[0])],return_counts =True)
x
Out[343]:
array([(0,), (0, 0), (0, 0, 0), (0, 0, 0, 0, 0, 0, 0, 0),
(0, 0, 0, 0, 0, 0, 0, 0, 0), (1,), (1, 1), (1, 1, 1), (1, 1, 1, 1),
(1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 1, 1)], dtype=object)
y
Out[344]: array([13, 6, 3, 1, 1, 14, 5, 3, 1, 1, 1], dtype=int64)
为了更好的展示
df= pd.DataFrame(x.tolist()).assign(Number=lambda x : x.count(1),Unique=y).dropna(1)
df
Out[350]:
0 Number Unique
0 0 1 13
1 0 2 6
2 0 3 3
3 0 8 1
4 0 9 1
5 1 1 14
6 1 2 5
7 1 3 3
8 1 4 1
9 1 5 1
10 1 7 1
你想知道每个重复链的数量、长度甚至位置吗?
考虑以下功能:
def consec_ones_cntr(it, thrshld):
n = 0
for i, v in enumerate(it):
if v:
n += 1
else:
if n >= thrshld:
yield i-n, n
n = 0
我可以随意使用@Scottboston示例数据:
# import numpy as np
# import pandas as pd
# np.random.seed(1234)
# df=pd.DataFrame(np.random.choice([0,1], 100))
那么,该函数的用法将是:
print(list(consec_ones_cntr(df[0], 5)))
导致
# [(7, 5), (70, 7)]
这意味着索引7和11之间有5个,70和76之间有7个。你能提供一个最小的样本数据集吗?请为这个问题添加样本数据和预期输出。这是一个典型的状态机问题,与典型的设计问题一起出现。在连续6次的情况下,计数是否在第五次重置?计数是否继续发现另一组与第一组重叠?或者,如果有7组,你会发现只有一组还是三组?这非常有效。非常感谢。首先,谢谢你的回答。这太棒了&我一定要用它。但是,我不知道如何读取输出。我知道5和7告诉我我有多少个1,但11和76告诉我什么?它们是1的相关链的最后一个索引,用于指示它们在数组中的位置。然而,由于序列的第一个索引通常是位置的选择指标,我知道您可能只想通过让搜索函数
产生I-n,n
…:)来改变这一点顺便说一句,进行了相应的编辑。