![](/img/trans.png)
[英]Select CONSECUTIVE rows from a DataFrame based on values in a column in Pandas with 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_cn
和b_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 行和最后一行組合在一起,這不是我想要的(我需要對start
和end
進行一些計算,因此它們必須保持有序)。
這個問題類似於如何在熊貓中連續出現重復項進行分組,但那里的解決方案僅適用於單列,我無法弄清楚如何使其同時適用於 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.