熊猫:通过多列查找另一个DataFrame中不存在的行

发布于 2021-01-29 15:09:48

与此python
pandas一样:如何在一个数据框中找到行,而在另一个数据框中却找不到?
但是有多列

这是设置:

import pandas as pd

df = pd.DataFrame(dict(
    col1=[0,1,1,2],
    col2=['a','b','c','b'],
    extra_col=['this','is','just','something']
))

other = pd.DataFrame(dict(
    col1=[1,2],
    col2=['b','c']
))

现在,我要选择其他行中df不存在的行。我想通过col1和进行选择col2

在SQL中,我会做:

select * from df 
where not exists (
    select * from other o 
    where df.col1 = o.col1 and 
    df.col2 = o.col2
)

在熊猫里,我可以做这样的事情,但是感觉很丑。如果df具有id列,则可以避免部分丑陋的情况,但并非总是如此。

key_col = ['col1','col2']
df_with_idx = df.reset_index()
common = pd.merge(df_with_idx,other,on=key_col)['index']
mask = df_with_idx['index'].isin(common)

desired_result =  df_with_idx[~mask].drop('index',axis=1)

因此,也许有一些更优雅的方法?

关注者
0
被浏览
105
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    由于0.17.0有一个新的indicator参数,您可以传递给merge它,以告诉您行是仅出现在左侧,右侧还是同时出现在两个行中:

    In [5]:
    merged = df.merge(other, how='left', indicator=True)
    merged
    
    Out[5]:
       col1 col2  extra_col     _merge
    0     0    a       this  left_only
    1     1    b         is       both
    2     1    c       just  left_only
    3     2    b  something  left_only
    
    In [6]:    
    merged[merged['_merge']=='left_only']
    
    Out[6]:
       col1 col2  extra_col     _merge
    0     0    a       this  left_only
    2     1    c       just  left_only
    3     2    b  something  left_only
    

    因此,您现在可以通过仅选择'left_only'行来过滤合并的df



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看