Я отсортировал по Date
и ID
наборам данных (df
):
Date ID Start_flag End_flag
01-01-2019 100 1 0
01-02-2019 100 0 0
01-03-2019 100 0 0
01-04-2019 100 0 0
01-05-2019 100 0 1
01-09-2019 100 1 0
01-10-2019 100 0 0
01-11-2019 100 0 0
01-12-2019 100 0 0
01-03-2019 500 1 0
01-04-2019 500 0 0
01-05-2019 500 0 0
01-06-2019 500 0 0
01-07-2019 500 0 0
01-08-2019 500 0 0
01-09-2019 700 1 0
01-10-2019 700 0 0
01-11-2019 700 0 1
Я хотел бы отфильтровать df
по последним фактическим Date
, где Start_flag
= Появляется 1, все данные, которые были до этого для того же ID
с Start_flag
= 1. Не должны быть извлечены.
Другими словами, если есть несколько раз, Start_flag=1
для одного и того же ID
, тогда оставьте только последний Start_flag=1
с максимальным Date
.
Ожидаемое представление df
:
Date ID Start_flag End_flag
01-09-2019 100 1 0
01-10-2019 100 0 0
01-11-2019 100 0 0
01-12-2019 100 0 0
01-03-2019 500 1 0
01-04-2019 500 0 0
01-05-2019 500 0 0
01-06-2019 500 0 0
01-07-2019 500 0 0
01-08-2019 500 0 0
01-09-2019 700 1 0
01-10-2019 700 0 0
01-11-2019 700 0 1
Я пытаюсь сделать это .groupby(['ID','Start_flag'])['Date'].last()
, но это неправильный подход.
Не могли бы вы мне помочь? Как я могу отфильтровать дополнительные данные из df
? Спасибо
РЕДАКТИРОВАТЬ: Возможное решение:
def filterTable(df):
result_list = []
for x in df['ID'].unique():
df_1 = df[df['ID']==x]
indx = df_1.where(((df_1['Start_flag']==0) & (df_1['Date']==df_1['Date'].min())) | (df_1['Start_flag'] == 1)).last_valid_index()
result_list.append(df_1.loc[indx:])
result= pd.concat(result_list)
return result
Условие df_1['Start_flag']==0
добавляется из-за возврата last_valid_index
для случаев, когда первоначально Start_flag=0
до End_flag=1
Кроме того, это не оптимальное решение из-за времени выполнения для огромного dataFrame. Попробуйте найти лучшее решение для этого.