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