删除不完全匹配的重复项

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

我需要从数据框中删除重复项,其中 A 列和 C 列中的相应值匹配,以及 B 列和 C 列中的相应值匹配。我的问题是 B 列中有空值,并且某些“重复项”不完全匹配。 B 列包含名称,对于某些行来说只有最后一个和第一个,但对于其他行来说有最后一个、第一个、中间和度数。姓氏和名字匹配的任何行都被视为重复行。

起始数据框:

d = {'A': [123498, 123498, 234875, 457898, 'SMITHJ', 'DOEJ',],
     'B': ['SIMON, PAUL JD', None,  'DOE, JANE MARY PHD', 'MERCURY, FREDRICK MS', None, 'DOE, JANE'], 
     'C': ['red', 'red', 'green', 'red', 'blue', 'green']}
df = pd.DataFrame(data=d)
df

      A            B                 C
0   123498   SIMON, PAUL JD         red
1   123498   None                   red
2   234875   DOE, JANE MARY PHD     green
3   457898   MERCURY, FREDRICK MS   red
4   SMITHJ   None                   blue
5   DOEJ     DOE, JANE              green

最终数据框:

      A            B                 C
0   123498   SIMON, PAUL JD         red
3   457898   MERCURY, FREDRICK MS   red
4   SMITHJ   None                   blue
5   DOEJ     DOE, JANE              green

我使用

df.drop_duplicate(['A', 'C'])
从 A 列中删除重复项,并使用掩码从 B 列中删除精确的重复项,同时保留 Null 值。

此外,我保留哪一个重复行并不重要,因此索引 0 和 5 处的行可以被删除,而不是索引 1 和 2 处的行,这是可以接受的。

谢谢!

python pandas dataframe duplicates
1个回答
0
投票

代码

cond1 = ~df['C'].duplicated()
cond2 = ~df['A'].duplicated()
pat = r'(\w+,\s+\w+)(?:\s+\w+)?'
cond3 = ~df['B'].str.extract(pat, expand=False).duplicated()

num = (cond1 | (cond2 & cond3)).sum()

行数

编号:

4

如果你想过滤:

out = df[(cond1 | (cond2 & cond3))]

        A                     B      C
0  123498        SIMON, PAUL JD    red
2  234875    DOE, JANE MARY PHD  green
3  457898  MERCURY, FREDRICK MS    red
4  SMITHJ                  None   blue
© www.soinside.com 2019 - 2024. All rights reserved.