根据另一个数据帧的多个列过滤数据帧

Son*_*lor 4 python pandas

我有这样的数据帧:

    ID1    ID2
0   foo    bar
1   fizz   buzz
Run Code Online (Sandbox Code Playgroud)

而另一个像这样:

    ID1    ID2    Count    Code   
0   abc    def      1        A
1   fizz   buzz     5        A
2   fizz1  buzz2    3        C
3   foo    bar      6        Z
4   foo    bar      6        Z
Run Code Online (Sandbox Code Playgroud)

我想要做的是过滤第二个数据帧,其中ID1和ID2匹配第一个数据帧中的一行,每当匹配时我想从第一个数据帧中删除该行以避免重复.这将产生一个如下所示的数据框:

    ID1    ID2    Count    Code   
1   fizz   buzz     5        A
3   foo    bar      6        Z
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过嵌套for循环,逐步遍历所有行,并在我得到匹配时从第一帧手动删除一行但我想知道是否有更多的pythonic方法来做到这一点.我没有大熊猫的经验,所以可能有一个更清洁的方法,我不知道.我之前使用.isin()但不得不废弃它.每个ID对最多可以存在于数据帧中N次,我需要过滤后的帧包含一对0到N个实例.

jez*_*ael 5

如果只有相同的列用于两者,则使用mergewith :drop_duplicatesdf

df = pd.merge(df1,df2.drop_duplicates())
print (df)
    ID1   ID2  Count Code
0   foo   bar      6    Z
1  fizz  buzz      5    A
Run Code Online (Sandbox Code Playgroud)

如果只需要在ID列中检查dupe :

df = pd.merge(df1,df2.drop_duplicates(subset=['ID1','ID2']))
print (df)
    ID1   ID2  Count Code
0   foo   bar      6    Z
1  fizz  buzz      5    A
Run Code Online (Sandbox Code Playgroud)

如果更多列重叠添加参数on:

df = pd.merge(df1, df2.drop_duplicates(), on=['ID1','ID2'])
Run Code Online (Sandbox Code Playgroud)

如果没有删除欺骗行:

df = pd.merge(df1,df2)
print (df)
    ID1   ID2  Count Code
0   foo   bar      6    Z
1   foo   bar      6    Z
2  fizz  buzz      5    A
Run Code Online (Sandbox Code Playgroud)