我有两个有一些共同行的熊猫数据框。
假设 dataframe2 是 dataframe1 的子集。
如何获取不在 dataframe2 中的 dataframe1 行?
df1 = pandas.DataFrame(data = {'col1' : [1, 2, 3, 4, 5], 'col2' : [10, 11, 12, 13, 14]}) df2 = pandas.DataFrame(data = {'col1' : [1, 2, 3], 'col2' : [10, 11, 12]})
df1
col1 col2 0 1 10 1 2 11 2 3 12 3 4 13 4 5 14
df2
col1 col2 0 1 10 1 2 11 2 3 12
预期结果:
col1 col2 3 4 13 4 5 14
一种方法是将内部合并的结果存储在两个 dfs 中,然后当一列的值不常见时,我们可以简单地选择行:
In [119]: common = df1.merge(df2,on=['col1','col2']) print(common) df1[(~df1.col1.isin(common.col1))&(~df1.col2.isin(common.col2))] col1 col2 0 1 10 1 2 11 2 3 12 Out[119]: col1 col2 3 4 13 4 5 14
编辑
您发现的另一种方法是使用isinwhich 将生成NaN可以删除的行:
isin
NaN
In [138]: df1[~df1.isin(df2)].dropna() Out[138]: col1 col2 3 4 13 4 5 14
但是,如果 df2 没有以相同的方式开始行,那么这将不起作用:
df2 = pd.DataFrame(data = {'col1' : [2, 3,4], 'col2' : [11, 12,13]})
将产生整个df:
In [140]: df1[~df1.isin(df2)].dropna() Out[140]: col1 col2 0 1 10 1 2 11 2 3 12 3 4 13 4 5 14