簡體   English   中英

在一列 pandas dataframe 中的 groupby 連續數字

[英]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。

我已經嘗試過這兩個帖子: post1post2但仍然有問題要解決這個問題。

我試圖將它們分組: 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

作為單個 dataframe:

運行上述和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM