#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) и попробуйте что-нибудь сделать, чтобы в итоге вы получили что-то, что работает со всеми вашими данными.