2 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可以嘗試使用滾動(dòng):
def merge_intervals(intervals):
sorted_intervals = sorted(intervals, key=lambda x: x[0])
interval_index = 0
#print(sorted_intervals)
for i in sorted_intervals:
if i[0] > sorted_intervals[interval_index][1]:
interval_index += 1
sorted_intervals[interval_index] = i
else:
sorted_intervals[interval_index] = [sorted_intervals[interval_index][0], i[1]]
#print(sorted_intervals)
return sorted_intervals[:interval_index+1]
end_ids = df[df['value'].rolling(3).apply(lambda x: (x==0).all())==1].index
start_ids = end_ids-3
intervals = merge_intervals([*zip(starts_ids, end_ids)])
for i,interval in enumerate(intervals):
df[interval[0]+1:interval[1]+1].to_csv('df_' + str(i) + '.csv')
不是最漂亮的代碼,但它可以工作,合并函數(shù)在這里找到:在Python中合并重疊間隔

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
找到值等于零的位置,并取長(zhǎng)度為 3 的滾動(dòng)總和。找出滾動(dòng)總和等于 3 的位置。結(jié)果將滯后 2 個(gè)空格,因此我們采用結(jié)果的 -1 平移和 -2 移位版本的結(jié)果的邏輯。or
mask = df['value'].eq(0).rolling(3).sum().eq(3)
mask |= mask.shift(-2) | mask.shift(-1)
為了得到組,我取邏輯否定的累積和。對(duì)于每個(gè)非零值,這將遞增,并停滯在零處。但是,每組零將不同。在我使用 時(shí),這并不重要,因?yàn)槲覍⑹褂檬鬃帜竵韮H查看首先滿足條件的行。groupbymask
但是,生成的組將是一組非連續(xù)的整數(shù)。因?yàn)槲也幌矚g這樣,所以我曾經(jīng)給這些組提供從零開始的唯一整數(shù)值。factorize
grp_masked = (~mask).cumsum()[mask].factorize()[0]
g = df[mask].groupby(grp_masked)
保存文件
for grp, d in g:
d.to_csv(f'df_{grp}.csv', index=False)
創(chuàng)建詞典
df_dict = {grp: d for grp, d in g}
詳
這將顯示原始數(shù)據(jù)幀以及顯示我們計(jì)算的一些內(nèi)容的其他列。
group_series = pd.Series(
grp_masked, df.index[mask], pd.Int64Dtype()
)
df_ = df.assign(
EqZero=df['value'].eq(0),
Roll2=df['value'].eq(0).rolling(3).sum(),
Is3=df['value'].eq(0).rolling(3).sum().eq(3),
Shift=lambda d: d.Is3.shift(-2) | d.Is3.shift(-1),
Mask=mask,
PreGrp=(~mask).cumsum(),
Grp=group_series
)
df_
date value EqZero Roll2 Is3 Shift Mask PreGrp Grp
0 2/10/19 34 False NaN False False False 1 <NA>
1 2/11/19 0 True NaN False False False 2 <NA>
2 2/12/19 0 True 2.0 False False False 3 <NA>
3 2/13/19 34 False 2.0 False False False 4 <NA>
4 2/14/19 34 False 1.0 False False False 5 <NA>
5 2/15/19 34 False 0.0 False False False 6 <NA>
6 2/16/19 34 False 0.0 False False False 7 <NA>
7 2/17/19 0 True 1.0 False True True 7 0
8 2/18/19 0 True 2.0 False True True 7 0
9 2/19/19 0 True 3.0 True False True 7 0
10 2/20/19 22 False 2.0 False False False 8 <NA>
11 2/21/19 22 False 1.0 False False False 9 <NA>
12 2/22/19 22 False 0.0 False False False 10 <NA>
13 2/23/19 22 False 0.0 False False False 11 <NA>
14 2/24/19 0 True 1.0 False True True 11 1
15 2/25/19 0 True 2.0 False True True 11 1
16 2/26/19 0 True 3.0 True True True 11 1
17 2/27/19 0 True 3.0 True False True 11 1
18 2/28/19 1 False 2.0 False False False 12 <NA>
19 3/1/19 2 False 1.0 False False False 13 <NA>
20 3/2/19 2 False 0.0 False False False 14 <NA>
21 3/3/19 1 False 0.0 False False False 15 <NA>
22 3/4/19 0 True 1.0 False True True 15 2
23 3/5/19 0 True 2.0 False True True 15 2
24 3/6/19 0 True 3.0 True False True 15 2
25 3/7/19 3 False 2.0 False False False 16 <NA>
26 3/8/19 3 False 1.0 False False False 17 <NA>
27 3/9/19 3 False 0.0 False False False 18 <NA>
28 3/10/19 0 True 1.0 False False False 19 <NA>
添加回答
舉報(bào)