去除不完全匹配的重复项

1 投票
1 回答
60 浏览
提问于 2025-04-14 17:09

我需要从我的数据表中去掉重复的记录,条件是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列的完全重复记录,同时保留空值。

另外,我并不在乎保留哪一行的重复记录,所以索引为0和5的行也可以被去掉,而不是索引为1和2的行,这样也是可以接受的。

谢谢!

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()

cond = (cond1 | (cond2 & cond3)    

行数统计

num = cond.sum()

数量:

4

如果你想要过滤:

out = df[cond]

输出

        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

撰写回答