Python 如何在两个数据帧对象上执行SQL样式不相交或设置差异?

Python 如何在两个数据帧对象上执行SQL样式不相交或设置差异?,python,pandas,Python,Pandas,我试图用Pandas来解决一个问题,因为一个愚蠢的DBA没有备份一个现已崩溃的数据集,所以我试图找出两列之间的差异。出于我不想进入的原因,我使用的是熊猫而不是数据库 我想做的是,考虑到: Dataset A = [A, B, C, D, E] Dataset B = [C, D, E, F] 我想找出不相交的值 Dataset A!=B = [A, B, F] 在SQL中,这是标准的集合逻辑,根据方言的不同而不同,但却是一个标准函数。我如何优雅地将其应用于熊猫?我很想输入一些代码,但我没

我试图用Pandas来解决一个问题,因为一个愚蠢的DBA没有备份一个现已崩溃的数据集,所以我试图找出两列之间的差异。出于我不想进入的原因,我使用的是熊猫而不是数据库

我想做的是,考虑到:

Dataset A = [A, B, C, D, E]  
Dataset B = [C, D, E, F]
我想找出不相交的值

Dataset A!=B = [A, B, F]
在SQL中,这是标准的集合逻辑,根据方言的不同而不同,但却是一个标准函数。我如何优雅地将其应用于熊猫?我很想输入一些代码,但我没有一个是完全正确的。这是一种我不知道我不知道的情况。。。。。Pandas为相交和并集设置了逻辑,但没有为不相交/设置差异设置任何逻辑


谢谢

您可以使用
set.symmetric_difference
功能:

In [1]: df1 = DataFrame(list('ABCDE'), columns=['x'])

In [2]: df1
Out[2]:
   x
0  A
1  B
2  C
3  D
4  E

In [3]: df2 = DataFrame(list('CDEF'), columns=['y'])

In [4]: df2
Out[4]:
   y
0  C
1  D
2  E
3  F

In [5]: set(df1.x).symmetric_difference(df2.y)
Out[5]: set(['A', 'B', 'F'])

这里有一个多栏的解决方案,可能不是很有效,我很想得到一些关于加快这一点的反馈:

input = pd.DataFrame({'A': [1, 2, 2, 3, 3], 'B': ['a', 'a', 'b', 'a', 'c']})
limit = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']})


def set_difference(input_set, limit_on_set):
    limit_on_set_sub = limit_on_set[['A', 'B']]
    limit_on_tuples = [tuple(x) for x in limit_on_set_sub.values]
    limit_on_dict = dict.fromkeys(limit_on_tuples, 1)

    entries_in_limit = input_set.apply(lambda row:
        (row['A'], row['B']) in limit_on_dict, axis=1)

    return input_set[~entries_in_limit]

 >>> set_difference(input, limit)

  item  user
1    a     2
3    a     3