在熊猫中获取字符串的开始和结束索引

时间:2020-08-04 14:27:17

标签: pandas dataframe vectorization

我有一个如下所示的df:

|Index|Value|Anomaly|
---------------------
|0    |4    |       |
|1    |2    |Anomaly|
|2    |1    |Anomaly|
|3    |2    |       |
|4    |6    |Anomaly|

我想获取连续异常计数的开始和结束索引,因此在这种情况下,它将是[[1,2],[4]]

我知道我必须使用.shift.cumsum,但我迷路了,希望有人能启发我。

1 个答案:

答案 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]]