我有一个如下所示的df:
|Index|Value|Anomaly|
---------------------
|0 |4 | |
|1 |2 |Anomaly|
|2 |1 |Anomaly|
|3 |2 | |
|4 |6 |Anomaly|
我想获取连续异常计数的开始和结束索引,因此在这种情况下,它将是[[1,2],[4]]
我知道我必须使用.shift
和.cumsum
,但我迷路了,希望有人能启发我。
答案 0 :(得分:2)
以布尔系列的总和获取连续的组,该布尔系列检查值是否不是“ Anomoly”。使用where
,以便我们仅采用“ Anomoly”行。然后,我们可以遍历各个组并获取索引。
m = df['Anomaly'].ne('Anomaly')
[[idx[0], idx[-1]] if len(idx) > 1 else [idx[0]]
for idx in df.groupby(m.cumsum().where(~m)).groups.values()]
#[[1, 2], [4]]
或者,如果您想使用更长的groupby
,则可以获取第一个索引和最后一个索引,然后删除重复项(以处理仅1个条纹)并将其放入列表列表中。不过这要慢得多
(df.reset_index().groupby(m.cumsum().where(~m))['index'].agg(['first', 'last'])
.stack()
.drop_duplicates()
.groupby(level=0).agg(list)
.tolist())
#[[1, 2], [4]]