我有一个包含两列的DataFrame。第一个是time
,刚从1开始计数。
重要的是一堆1和0。我想知道1重复特定n次的次数。例如,假设我有100个随机放置的1和0的值,我想知道连续多少次至少有5个1。这意味着我想知道它重复5、6、7或更多次的次数。
以前有人做过类似的事情吗?
答案 0 :(得分:4)
尝试:
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
答案 1 :(得分:1)
做起来不太优雅。
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
答案 2 :(得分:1)
您是否还想知道每个重复链有多少条,甚至有多久?
考虑以下功能:
redis-server
我可以随时使用@ScottBostons示例数据:
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
然后该函数的用法为:
# 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和11之间有5个,而索引70和76之间有7个。
答案 3 :(得分: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