查找并标记重复项

问题描述 投票:0回答:1

目标: 我需要根据列名称、邮政编码、街道和门牌号检测重复项 - 尽管邮政编码、街道和门牌号可以为空。 要保留的记录(master)应该是rel_a 数量最大的记录。如果两条或更多记录相同,则应以最近修改的日期为准。 我需要标记要保留的主记录,以及记录是否有重复项的信息,如果有,有多少重复项以及记录到哪个主记录。

作为输入的数据示例:

id,name,postcode,street,housenr,nr_rel_a,nr_rel_b,date_modified
1,abc,1000,a,4,10,5,01-01-2020
2,abc,1000,a,4,7,5,01-01-2019
3,abc,,,,5,5,01-01-2009
4,d,2000,d,5,3,5,01-01-2020
5,efg,3000,c,6,22,5,01-01-2020
6,efg,3000,,,2,5,01-01-2009
7,h,4000,d,7,56,5,01-01-2018
8,ijk,5000,e,8,50,5,01-01-2019
9,ijk,5000,e,8,50,5,01-01-2018
10,ijk,5000,e,,5,5,01-01-2009

我想象的理想输出的数据示例(包括从复制到主设备的 rel_a 和 rel_b 的总和):

id,name,postcode,street,housenr,nr_rel_a,nr_rel_b,date_modified,keep,nr_Dup,category,referenceID,Master_nr_rel_a,Master_nr_rel_b
1,abc,1000,a,4,10,5,01-01-2020,FALSE,2,MasterDup,1,22,15
2,abc,1000,a,4,7,5,01-01-2019,TRUE,,Dup,1,,
3,abc,,,,5,5,01-01-2009,TRUE,,Dup,1,,
4,d,2000,d,5,3,5,01-01-2020,FALSE,0,Master,4,4,5
5,efg,3000,c,6,22,5,01-01-2020,FALSE,1,MasterDup,5,24,10
6,efg,3000,,,2,5,01-01-2009,TRUE,,Dup,5,,
7,h,4000,d,7,56,5,01-01-2018,FALSE,0,Master,7,56,5
8,ijk,5000,e,8,50,5,01-01-2019,FALSE,2,MasterDup,8,105,15
9,ijk,5000,e,8,50,5,01-01-2018,TRUE,,Dup,8,,
10,ijk,5000,e,,5,5,01-01-2009,TRUE,,Dup,8,,

我通读了评论,其中描述了标记重复项,但我无法进行调整来服务我的情况。 我愿意相信,当我对 a) nr_rel_a 和 b) date_modified 上的输入列表进行排序时,我可以使用 df.duplicate(keep='first') 来标记主版本。 当应用作重复标准的一个或多个字段为空时,我很难进行检测。我还很难添加 ReferenceID 和 very_nice_to_have 附加信息。

如果能为初学者提供提示或可能简单的代码示例,我将不胜感激。 数据集很小(少于 20k 条记录)。

python duplicates detection
1个回答
0
投票

我将使用姓名、姓名、邮政编码、街道和门牌号创建一个 unique_key 列。但由于邮政编码、街道和门牌号可以为空,所以我会在这些上使用 ifnull 来创建默认值。也许“null”是一个字符串。然后我会在最后使用限定来强制基于 nr_rel_adate_modified 排序的唯一性。

select
  id
, name
, postcode
, street
, housenr
, nr_rel_a
, nr_rel_b
, date_modified
, name || ifnull(postcode, 'null') || ifnull(street, 'null') || ifnull(housenr, 'null') as unique_key
from table_name
qualify row_number() over (partition by unique_key order by nr_rel_a, date_modified) = 1
© www.soinside.com 2019 - 2024. All rights reserved.