Python 2.7 with Pandas:如何恢复两个数据帧的不相交部分?

use*_*387 5 python python-2.7 pandas

我有两个数据框,第二个是第一个的子集。我现在如何找到第一个数据帧中未包含在第二个数据帧中的部分?例如:

new_dataframe_1

    A   B   C   D
1   a   b   c   d
2   e   f   g   h
3   i   j   k   l
4   m   n   o   p


new_dataframe_2

    A   B   C   D
1   a   b   c   d
3   i   j   k   l


new_dataframe_3 = not intersection of new_dataframe_1 and new_dataframe_2


    A   B   C   D
2   e   f   g   h
4   m   n   o   p
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

编辑:我最初将交叉点称为联合,但后来改变了这一点。

Kar*_* D. 6

嗯,这样做的一种方法是使用isin(但您也可以使用merge命令来做到这一点......我展示了两者的示例)。例如:

>>> df1

   A  B  C  D
0  a  b  c  d
1  e  f  g  h
2  i  j  k  l
3  m  n  o  p

>>> df2

   A  B  C  D
0  a  b  c  d
1  i  j  k  l

>>> df1[~df1.isin(df2.to_dict('list')).all(axis=1)]

   A  B  C  D
1  e  f  g  h
3  m  n  o  p
Run Code Online (Sandbox Code Playgroud)

解释。isin如果你给它一个字典,可以检查使用多列:

>>> df2.to_dict('list')

{'A': ['a', 'i'], 'C': ['c', 'k'], 'B': ['b', 'j'], 'D': ['d', 'l']}
Run Code Online (Sandbox Code Playgroud)

然后isin将创建一个 booleen df,我可以用它来选择我们想要的列(在这种情况下,需要所有列匹配,然后用 否定~):

>>> df1.isin(df2.to_dict('list'))

      A      B      C      D
0   True   True   True   True
1  False  False  False  False
2   True   True   True   True
3  False  False  False  False
Run Code Online (Sandbox Code Playgroud)

在特定示例中,我们不需要提供isin数据框的 dict 版本,因为我们只需查看 A 列即可识别有效行:

>>> df1[~df1['A'].isin(df2['A'])]

   A  B  C  D
1  e  f  g  h
3  m  n  o  p
Run Code Online (Sandbox Code Playgroud)

您也可以使用merge. 在子集数据框中创建一个唯一的列。合并时,较大数据框中的唯一行将NaN用于您创建的列:

>>> df2['test'] = 1
>>> new = df1.merge(df2,on=['A','B','C','D'],how='left')
>>> new

   A  B  C  D  test
0  a  b  c  d     1
1  e  f  g  h   NaN
2  i  j  k  l     1
3  m  n  o  p   NaN
Run Code Online (Sandbox Code Playgroud)

因此,选择 test == NaN 的行并删除测试列:

>>> new[new.test.isnull()].drop('test',axis=1)

   A  B  C  D
1  e  f  g  h
3  m  n  o  p
Run Code Online (Sandbox Code Playgroud)

编辑: @user3654387 指出合并方法对于大型数据帧的性能要好得多。