我需要从数据框中删除重复项,其中 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 处的行,这是可以接受的。
谢谢!
代码
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