У меня есть таблица базы данных, в которой внешний процесс автоматически вставляет строки так часто. Из-за характера данных мне нужно быть бдительным в обнаружении любых возможных «дубликатов» (на самом деле это только похожие строки, потому что важны только определенные столбцы) и их удалении. Я планирую использовать запрос к базе данных, чтобы идентифицировать все похожие строки в кадре данных, а затем отсортировать и создать подмножество строк данных для строк keep. Идея использует левое соединение исходного кадра данных с оператором хранения keep и логическим оператором для определения строк, которые необходимо удалить в пандах, которые получают строки, которых нет в другом кадре данных . Можете ли вы сказать мне, если я на правильном пути? Я хочу быть очень осторожным относительно логики удаления записей из моей базы данных.
Исходный кадр данных выглядит следующим образом:
ID Account Type Date RowID
0 12 GOB H 11/12/18 Az123
1 12 GOB H 11/12/18 Az125
2 12 JPG H 11/15/18 Az175
3 12 JPG H 11/17/18 Az189
4 15 BLU H 11/1/18 Ax127
5 15 BLU D 11/18/18 Ax135
6 15 BLU H 11/8/18 Ax175
Важно вести единую запись для каждой комбинации ID / Учетная запись, причем предпочтение отдается сначала учетным записям типа D, а затем - самой старой дате.
Ниже приводится желаемое подмножество хранения.
Желаемое содержание подмножества
ID Account Type Date RowID
0 15 BLU D 11/18/18 Ax135
1 12 GOB H 11/12/18 Az123
2 12 JPG H 11/15/18 Az175
Код: Отредактировано с помощью W-B
df = pd.read_sql(similar_rows_sql)
df['helpkey']=df.Type.eq('D')
keep_df = df.sort_values(['Date']).sort_values(
['helpkey'], ascending=False).drop_duplicates(['ID','Account'], keep='first')
df_all = df.merge(keep_df, how='left', indicator=True)
df_remove = df_all.loc[df_all['_merge']== 'left_only']
for x in df_remove[RowID]:
cursor.execute(remove_duplicate_sql, x)
connection.commit()
Тип концерна удален благодаря W-B
Мое единственное остающееся беспокойство - эта логика питонна и точна для моих намерений. Может кто-нибудь уложить мои опасения, что это верно?