Pandas. Удаление записей о повторных ошибках из dataframe
Привет всем!
Имеется dataframe типа:
SrvName | Started | Status | Size |
---|---|---|---|
server1 | 2023-06-01 14:00:00 | sucsess | 10000 |
server2 | 2023-06-01 14:05:00 | sucsess | 12000 |
server3 | 2023-06-01 14:25:00 | sucsess | 20000 |
server1 | 2023-06-02 14:00:00 | failed | 0 |
server2 | 2023-06-01 14:05:00 | sucsess | 1000 |
server1 | 2023-06-02 14:10:00 | failed | 0 |
server1 | 2023-06-02 14:20:00 | failed | 0 |
server3 | 2023-06-02 14:25:00 | sucsess | 20000 |
server1 | 2023-06-02 14:25:00 | failed | 0 |
server1 | 2023-06-02 14:30:00 | failed | 0 |
итд.
Нужно дропнуть записи со значением failed в столбце Status которые возникли в течении 30 минут, после первого failed в разрезе SrvName (выделил болдом). В итоге должна остаться одна запись failed на сервер в диапазоне 30 минут от возникновения первого failed.
Update: События Started не обязательно могут быть кратным 5 минутам.
Решил вот так:
import pandas as pd
df = pd.DataFrame([
['server1','2023-06-01 14:00:00','sucsess',10000],
['server2','2023-06-01 14:05:00','sucsess',12000],
['server3','2023-06-01 14:25:00','sucsess',20000],
['server1','2023-06-02 14:00:00','failed',0],
['server2','2023-06-01 14:05:00','sucsess',1000],
['server1','2023-06-02 14:10:00','failed',0],
['server1','2023-06-02 14:20:00','failed',0],
['server3','2023-06-02 14:25:00','sucsess',20000],
['server1','2023-06-02 14:25:00','failed',0],
['server1','2023-06-02 14:30:00','failed',0],
['server2','2023-07-02 14:30:00','failed',0]],
columns=['SrvName','Started','Status','Size'])
df['Started']=pd.to_datetime(df.Started)
df_temp=df.loc[df['Status']=='failed'].groupby(['SrvName'])['Started'].diff(periods=1).fillna(pd.Timedelta('01:30:00'))
df_temp2=df_temp[df_temp>pd.Timedelta('00:30:00')]
df_filtered = df.loc[(df.Status == 'sucsess') | df.index.isin(df_temp2.index)]
ИМХО несколько корявенько выглядит решение. Хотя бы тем, что я присваиваю первым событиям со статусом failed timedelta равное полутора часам, ну что бы априори было больше 30 минут. Кроме того, в этом решении фильтруются события со статусом failed произошедшие в течении 30 минут от предыдущего события, а не от того, что было первым. Вот это пока не смог победить.
Спасибо камрадам, что натолкнули на правильные мысли!