我如何检测重复项,然后交叉检查两列是否有相似的值?

时间:2017-02-27 10:00:28

标签: python pandas numpy dataframe

所以我有一个像这样的数据框

 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行。我想在选择之后对此执行一次操作。输入名称的某种日期检查。

我如何实现这一目标?我尝试使用重复但这对第二次比较没有多大帮助?

1 个答案:

答案 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