所以我有一个像这样的数据框
No fname sname landline address
1 Alphred Thomas 123 A
2 Peter Jay 345 B
3 Donald Hook 123 A
4 Jay Donald 345 B
5 Jay Donald 123 A
6 Haskell Peter 123 B
现在我希望得到所有重复的固定电话和地址。因此,在上面的情况中,组(123,A)将是一组重复实体,而(345,B)将是另一组重复实体。我想忽略(123,B),因为这只发生一次。
现在,对于每个重复组,我想检查fnmae和sname列中是否出现单个名称。因此,在(123,A)的情况下,我们想要捕获donald出现在fname和sname上的行(基本上它们必须是两个不同的行,并且两列必须具有相似的名称)所以在这种情况下在上面我们会选择第3行和第5行。我想在选择之后对此执行一次操作。输入名称的某种日期检查。
我如何实现这一目标?我尝试使用重复但这对第二次比较没有多大帮助?
答案 0 :(得分:2)
您可以groupby
使用isin
进行掩码,然后使用boolean indexing
:
mask = df.groupby(['landline','address']).apply(lambda x: x.fname.isin(x.sname) |
x.sname.isin(x.fname) &
(len(x) > 1))
mask = mask.reset_index(level=['landline','address'], drop=True).sort_index()
print (mask)
0 False
1 True
2 True
3 True
4 True
5 False
dtype: bool
df1 = df[mask]
print (df1)
No fname sname landline address
1 2 Peter Jay 345 B
2 3 Donald Hook 123 A
3 4 Jay Donald 345 B
4 5 Jay Donald 123 A
编辑:我认为您可以使用自定义功能filtering
:
def f(x):
print (x)
mask = x.fname.isin(x.sname) | x.sname.isin(x.fname) & (len(x) > 1)
x1 = x[mask]
return x1
df2 = df.groupby(['landline','address']).apply(f).reset_index(drop=True)
print (df2)
No fname sname landline address
0 3 Donald Hook 123 A
1 5 Jay Donald 123 A
2 2 Peter Jay 345 B
3 4 Jay Donald 345 B