簡體   English   中英

在pandas中連續出現兩列值的Groupby

[英]Groupby consecutive occurrences of two column values in pandas

我有一個具有這種結構的熊貓數據框:

ID    loc    start    end    a_cn   b_cn
A     1      123      123    1      1
A     1      125      125    1      1
A     1      235      235    1      1
A     1      456      456    2      0
A     1      556      556    2      0
A     1      586      586    2      1
A     1      596      596    2      1
A     1      676      676    1      1

我需要做的是能夠對a_cnb_cn相同的連續行進行a_cn ,但如果存在“差距”則不行。 換句話說,上述數據上的組將是

第一組

A     1      123      123    1      1
A     1      125      125    1      1
A     1      235      235    1      1

第 2 組

A     1      456      456    2      0
A     1      556      556    2      0

第 3 組

A     1      586      586    2      1
A     1      596      596    2      1

第 4 組

A     1      676      676    1      1

單獨使用groupby行不通的,因為它會將前 3 行和最后一行組合在一起,這不是我想要的(我需要對startend進行一些計算,因此它們必須保持有序)。

這個問題類似於如何在熊貓中連續出現重復項進行分組,但那里的解決方案僅適用於單列,我無法弄清楚如何使其同時適用於 2 列。

我也測試過

diff = (
    (df["a_cn"] != df["a_cn"].shift()) &
    (df["b_cn"] != df["b_cn"].shift())
).cumsum()

但它並沒有真正做到我想要的,因為它在第 3 組上跳閘,與前一組相比,該組具有相同的a_cn 作為一個非工作示例:

>>> diff

0    1
1    1
2    1
3    2
4    2
5    2
6    2
7    2

這顯然是不正確的。

你既可以用列比較DataFrame.ne!=由兩列的轉移行,然后添加DataFrame.any如果真至少在一列中,最后添加的累積和測試:

diff = df[["a_cn","b_cn"]].ne(df[["a_cn","b_cn"]].shift()).any(axis=1).cumsum()
#alternative
diff = (df[["a_cn","b_cn"]] != df[["a_cn","b_cn"]].shift()).any(axis=1).cumsum()
print (diff)
0    1
1    1
2    1
3    2
4    2
5    3
6    3
7    4
dtype: int32

您的解決方案應該更改為| 對於按位OR

diff = (
    (df["a_cn"] != df["a_cn"].shift()) |
    (df["b_cn"] != df["b_cn"].shift())
).cumsum()
print (diff)
0    1
1    1
2    1
3    2
4    2
5    3
6    3
7    4
dtype: int32

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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