Панды, идентифицирующие и удаляющие похожие / повторяющиеся строки по критериям - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть таблица базы данных, в которой внешний процесс автоматически вставляет строки так часто. Из-за характера данных мне нужно быть бдительным в обнаружении любых возможных «дубликатов» (на самом деле это только похожие строки, потому что важны только определенные столбцы) и их удалении. Я планирую использовать запрос к базе данных, чтобы идентифицировать все похожие строки в кадре данных, а затем отсортировать и создать подмножество строк данных для строк 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

Мое единственное остающееся беспокойство - эта логика питонна и точна для моих намерений. Может кто-нибудь уложить мои опасения, что это верно?

1 Ответ

0 голосов
/ 08 ноября 2018

Использование справочной клавиши

df['helpkey']=df.Type.eq('D')# return T when it is D , so we sort the helpkey , make sure D always at the end 

df.Date=pd.to_datetime(df.Date)
df.sort_values(['ID','helpkey','Date']).drop_duplicates(['ID','Account'],keep='last')
Out[163]: 
   ID Account Type       Date  RowID  helpkey
1  12     GOB    H 2018-11-12  Az125    False
3  12     JPG    H 2018-11-17  Az189    False
5  15     BLU    D 2018-11-18  Ax135     True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...