7

我正在尝试使用 Pandas 解决一个白痴 DBA 没有备份现在崩溃的数据集的问题,所以我试图找出两列之间的差异。由于我不会进入的原因,我使用的是 Pandas 而不是数据库。

我想做的是,给定:

Dataset A = [A, B, C, D, E]  
Dataset B = [C, D, E, F]

我想找到不相交的值。

Dataset A!=B = [A, B, F]

在 SQL 中,这是标准集逻辑,根据方言的不同实现不同,但它是一个标准功能。如何在 Pandas 中优雅地应用它?我很想输入一些代码,但我所拥有的一切都不是正确的。在这种情况下,我不知道我不知道什么..... Pandas 为交集和联合设置了逻辑,但没有为不相交/设置差异设置逻辑。

谢谢!

4

2 回答 2

9

您可以使用以下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'])
于 2013-01-18T19:21:58.893 回答
0

这是一个多列的解决方案,可能效率不高,我很想得到一些反馈,让这更快:

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
于 2014-05-12T09:02:49.397 回答