[英]groupby streak of numbers in one column of pandas dataframe
這是我的 dataframe:
import pandas as pd
df = pd.DataFrame(
{
'a': [0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
'b': [0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0]
}
)
這就是我想要分組的方式:
2 1 1
3 0 1
4 0 1
5 0 1
6 0 0
7 0 0
9 1 0
10 0 1
13 1 1
14 0 1
15 0 1
16 0 0
17 0 1
我想根據 b 列的值對這個 dataframe 進行分組。 首先要做的是在 a 列中找到 1。 然后我想繼續,只要 b 列中有 0,然后也得到 0 之后的行。 如果 a 中的值為 1 而 b 中的值為 0 我只想繼續一行。 基本上我想在 b 列中有 0 時立即停止,然后在 0 之后的一行中停止 go。
我已經嘗試過這兩個帖子: post1 , post2但仍然有問題要解決這個問題。
我試圖將它們分組: df.b.diff().cumsum()
但它沒有給我我想要的
使用cumsum
創建一個用於過濾/分組的輔助系列,然后使用 boolean 掩碼對每個組進行子過濾:
group = df['a'].cumsum()
for k, g in df[group>0].groupby(group):
# drop rows 2 places after the first 0
m = g['b'].ne(0).cummin().shift(2, fill_value=True)
print(g[m])
Output:
a b
2 1 1
3 0 1
4 0 1
5 0 1
6 0 0
7 0 0
a b
9 1 0
10 0 1
a b
13 1 1
14 0 1
15 0 1
16 0 0
17 0 1
運行上述和concat
,或者:
group = df['a'].cumsum()
m = df['b'].ne(0).groupby(group).apply(lambda x: x.cummin().shift(2, fill_value=True))
out = df[group.gt(0)&m]
Output:
a b
2 1 1
3 0 1
4 0 1
5 0 1
6 0 0
7 0 0
9 1 0
10 0 1
13 1 1
14 0 1
15 0 1
16 0 0
17 0 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.