[英]Select a number of rows in a dataframe after a valid condition
首先刪除前0
行1
:
df = df[df['entry'].eq(1).cumsum().ne(0)]
df = df.groupby(df['entry'].cumsum()).head(4)
Timestamp entry
1 11.2 1
2 11.3 0
3 11.4 0
4 11.5 0
7 11.8 1
8 11.9 0
9 12.0 0
10 12.1 0
詳情及說明:
對於在第一次匹配之前刪除所有值的一般解決方案,使用 Series.eq 進行比較,然后通過Series.eq
進行累積總和並通過Series.cumsum
進行Series.ne
- 因此在cumsum
操作后過濾掉所有0
值:
print (df.assign(comp1 = df['entry'].eq(1),
cumsum =df['entry'].eq(1).cumsum(),
mask = df['entry'].eq(1).cumsum().ne(0)))
Timestamp entry comp1 cumsum mask
0 11.1 0 False 0 False
1 11.2 1 True 1 True
2 11.3 0 False 1 True
3 11.4 0 False 1 True
4 11.5 0 False 1 True
5 11.6 0 False 1 True
6 11.7 0 False 1 True
7 11.8 1 True 2 True
8 11.9 0 False 2 True
9 12.0 0 False 2 True
10 12.1 0 False 2 True
通過boolean indexing
過濾后,創建具有組累積sum
的輔助Series
:
print (df['entry'].cumsum())
1 1
2 1
3 1
4 1
5 1
6 1
7 2
8 2
9 2
10 2
Name: entry, dtype: int64
因此,對於最終解決方案,使用具有4
值的GroupBy.head
來獲取具有1
行和下 3 行的行:
df = df.groupby(df['entry'].cumsum()).head(4)
print (df)
Timestamp entry
1 11.2 1
2 11.3 0
3 11.4 0
4 11.5 0
7 11.8 1
8 11.9 0
9 12.0 0
10 12.1 0
對於按組循環使用:
for i, g in df.groupby(df['entry'].cumsum()):
print (g.head(4))
如果想要 DataFrame 的DataFrame
列表:
L = [g.head(4) for i, g in df.groupby(df['entry'].cumsum())]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.