小编典典

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

python

与此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)

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


阅读 305

收藏
2021-01-20

共1个答案

小编典典

由于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

2021-01-20