4 回答

TA貢獻1847條經驗 獲得超7個贊
使用沒有任何附加/連接的 NumPy,再次為了性能 -
a = df.flag.values
out = (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 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)
一般情況(當可能有除 0 和 1 以外的數字時)
該解決方案將通過獲取要搜索的數字掩碼(1此處)并對其進行操作來修改為這些方面的內容 -
a = df.flag.values
m = a==1
out = (m[1:] & ~m[:-1]).sum() + m[0]

TA貢獻1836條經驗 獲得超5個贊
ne
想法是通過不等于比較連續組Series.shift
并僅過濾具有以下內容的組1
:
a = (df['flag'].ne(df['flag'].shift()) & df['flag'].eq(1)).sum()
print (a)
4
df_out=pd.DataFrame({'groups_of_one_count':[a]})
print (df_out)
groups_of_one_count
0 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 chained
0 1 True True True
1 1 False True False
2 0 True False False
3 1 True True True
4 0 True False False
5 1 True True True
6 1 False True False
7 0 True False False
8 1 True True True
9 1 False True False
10 1 False True False

TA貢獻1818條經驗 獲得超11個贊
使用純 numpy 可以提高性能:
(np.diff(np.append(df.flag.values,0)) == -1).sum()
思路1
:統計數據從到跳轉的次數0
。我們使用為系列以 結尾的情況np.append
添加尾隨,以便包含最后一個塊。0
1

TA貢獻1786條經驗 獲得超13個贊
首先,我們選擇index
不等于0,并找到索引diff
,如果差異不繼續(這里不是eq 1),那就是不同的組:
df[df.flag.ne(0)].index.to_series().diff().ne(1).sum() 4
添加回答
舉報