与此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
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.17.0有一个新的indicator参数,您可以传递给merge它,以告诉您行是仅出现在左侧,右侧还是同时出现在两个行中:
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
'left_only'