Как удалить дубликаты на основе частичного совпадения

#python #pandas #dataframe #duplicates

#python #pandas #фрейм данных #дубликаты

Вопрос:

Я даже не знаю, как подойти к этому, поскольку он кажется слишком сложным для моего уровня.

Представьте себе номера отслеживания курьеров, и я получаю некоторые дублированные обновления из вышестоящей системы в следующем формате:

изображение

смотрите прикрепленное изображение или небольшой фрагмент кода, который создает такую таблицу:

 import pandas as pd
incoming_df = pd.DataFrame({
    'Tracking ID' : ['4845','24345', '8436474', '457453', '24345-S2'],
    'Previous' : ['Paris', 'Lille', 'Paris', 'Marseille', 'Dijon'],
    'Current' : ['Nantes', 'Dijon', 'Dijon', 'Marseille', 'Lyon'],
    'Next' : ['Lyone', 'Lyon', 'Lyon', 'Rennes', 'NICE']
})
incoming_df
 

Очевидно, что идентификатор отслеживания 24345-S2 (зеленая стрелка) является дублированием 24345 (красная стрелка), однако он дублируется не полностью, а содержит более новую, обновленную информацию о местоположении (с историей) для посылки. Как мне удалить старую строку 24345 и сохранить новую строку 24345-S2 в наборе данных?

Длина идентификатора отслеживания может составлять от 4 до 20 символов, но ‘-S2’ всегда полезно добавляется. Спасибо!

Ответ №1:

Редактировать: новое решение:

 # extract duplicates
duplicates = df['Tracking ID'].str.extract('(. )-S2').dropna()

# remove older entry if necessary
df = df[~df['Tracking ID'].isin(duplicates[0].unique())]

 

Если запись 1234-S2 всегда находится ниже во фрейме данных, чем запись 1234, вы могли бы сделать что-то вроде:

 # remove the suffix from all entries
incoming_df['Tracking ID'] = incoming_df['Tracking ID'].apply(lambda x: x.split('-')[0])

# keep only the last entry of the duplicates
incoming_df = incoming_df.drop_duplicates(subset='Tracking ID', keep='last')

 

Комментарии:

1. спасибо за ответ, но я не могу быть уверен — S2 всегда идет вторым: это непредсказуемо. Кроме того, я хотел бы сохранить -S2 в нем, просто чтобы отслеживать, что эта строка была дубликатом. Может быть, есть другой способ …? но еще раз спасибо!

2. о … только что понял, что некоторые номера отслеживания могут иметь тире посередине, например 123-456-S2. Есть ли способ заставить разделение действовать справа налево?

3. Да, есть 😉

4. Это увлекательно!! Это работает как шарм! Я нахожусь в долгом пути, чтобы изучить его, поскольку я никогда не видел ~ tilda в заявлениях Pandas и не до конца понимаю, что они делают, но буду исследовать. дополнительный вопрос, если можно. Я замечаю, что некоторые записи имеют разные суффиксы: не только …-S2, но также …-S3, а иногда …-B2-S2 и …-M1-SR. Как я могу изменить (‘(. )-S2’), чтобы соответствовать всем этим случаям? Это формат регулярного выражения?

5. Да, это регулярное выражение. Вы могли бы проверить [ regex101.com /](regex101) и попробуйте что-нибудь сделать, чтобы в итоге вы получили что-то, что работает со всеми вашими данными.