首页 > 解决方案 > 如何根据部分匹配删除重复项

问题描述

我什至不知道如何处理它,因为它对我的水平来说太复杂了。

想象一下快递单号,我从上游系统收到一些重复的更新,格式如下:

图片

请参阅附件图像或创建此类表的一小段代码:

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

显然,跟踪 ID 24345-S2(绿色箭头)是 24345(红色箭头)的重复,但是,它不是完全重复的,而是包裹的更新的、更新的位置信息(带有历史记录)。如何删除旧行 24345 并在数据集中保留新行 24345-S2?

跟踪 ID 的长度可以是 4 到 20 个字符,但总是会附加“-S2”。谢谢!

标签: pythonpandasdataframeduplicates

解决方案


编辑:新解决方案:

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

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



如果 DataFrame 中的 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')


推荐阅读