У меня есть пример DataFrame ниже:
df = pd.DataFrame([[1, 1, 1,'2016-09-01','pay',1], [1, 2, 1, '2016-09-01','claims',1], [2, 3, 3, '2016-09-02','claims',1],[2,4,3,'2016-10-02','pay',2],[3,5,4,'2016-09-02','pay',1],[3,6,5,'2016-09-04','pay',2],[3,7,4,'2016-09-06','claims',3],[3,8,6,'2016-09-08','pay',4]], columns=['claim_id', 'payment_id', 'provider_id','date','dataset','date_rank'])
df['date'] = pd.to_datetime(df['date']) # this column ought to be date
df
Есть повторяющиеся платежи, которые нельзя удалить с помощью простой функции drop_duplicates(), поскольку решение об удалении строки зависит от ее отношения к другим строкам платежей с тем же идентификатором Claim_id.
Я хотел бы создать новый столбец с именем 'dup', в котором помечаются повторяющиеся строки, чтобы я мог просмотреть их, прежде чем удалять из DataFrame.
Логика, необходимая для точного удаления дубликатов:
Для каждого ИД_заявки в df:
Для платежа, где df['dataset'] == 'claims', проверьте, есть ли другой платеж для того же Claim_id, который имеет тот же provider_id и происходит до или в тот же df['date']. Если есть, пометьте новый столбец df['dup'] как True для платежа, где df['dataset'] == 'claims'. В противном случае пометьте новый столбец df['dup'] как False.
В этом примере идентификаторы payment_id 2 и 7 должны иметь значение True в новом столбце 'dup', в то время как все остальные идентификаторы платежей должны иметь значение False:
df_out = pd.DataFrame([[1, 1, 1,'2016-09-01','pay',1,False], [1, 2, 1, '2016-09-01','claims',1,True], [2, 3, 3, '2016-09-02','claims',1,False],[2,4,3,'2016-10-02','pay',2,False],[3,5,4,'2016-09-02','pay',1,False],[3,6,5,'2016-09-04','pay',2,False],[3,7,4,'2016-09-06','claims',3,True],[3,8,6,'2016-09-08','pay',4,False]], columns=['claim_id', 'payment_id', 'provider_id','date','dataset','date_rank','dup'])
df_out['date'] = pd.to_datetime(df_out['date']) # this column ought to be date
df_out
Я пробовал много разных вещей, в том числе пытался разбить это на шаги, но безуспешно. В одной из этих попыток я создал столбец date_rank, который помечает платежи в порядке их появления. Я включил это сюда на случай, если это будет полезно.
Можете ли вы еще раз объяснить, почему 2 и 7 payment_id верны? что такое "дублированная" строка?
Повторяться могут только строки набора данных «претензии». payment_id 2 является дубликатом payment_id 1, т.к. он взят из набора данных утверждений, имеет тот же Claim_id, provider_id И ту же дату, что и payment_id 1. provider_id И имеет более позднюю дату, чем payment_id 5. payment_id 3 не является дубликатом payment_id 4 bc, даже если он из набора данных утверждений, имеет тот же Claim_id и provider_id, что и payment_id 4, дата предшествует дате payment_id 4. Это ответило на ваш вопрос? Спасибо за помощь!