去除不完全匹配的重复项
我需要从我的数据表中去掉重复的记录,条件是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