Получение начального и конечного индексов строки в Pandas - PullRequest
1 голос
/ 04 августа 2020

У меня есть df, который выглядит так:

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

Я хочу получить начальный и конечный индексы последовательных счетчиков аномалий, поэтому в этом случае это будет [[1,2],[4]]

Я понимаю, что мне нужно использовать .shift и .cumsum, но я заблудился и надеюсь, что кто-то сможет просветить меня.

1 Ответ

2 голосов
/ 04 августа 2020

Получить последовательные группы, взяв итоги логической серии, которая проверяет, где значение не равно «Аномолии». Используйте where, чтобы мы брали только строки «Аномолия». Затем мы можем l oop по группам и захватить индексы.

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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...