2013-01-18 6 views
7

Próbuję użyć Pandas, aby rozwiązać problem dzięki uprzejmości idiota DBA, nie robiąc kopii zapasowej obecnie uszkodzonego zestawu danych, więc próbuję znaleźć różnice między dwiema kolumnami. Z powodów, dla których nie będę miał dostępu, używam Pand zamiast bazy danych.Jak wykonać rozłączną lub ustawioną różnicę w stylu SQL na dwóch obiektach DataFrame Pandy?

Co chciałbym zrobić, to, biorąc pod uwagę:

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

chciałbym znaleźć wartości, które są rozłączne.

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

W języku SQL jest to standardowa logika zestawu, realizowana w różny sposób w zależności od dialektu, ale standardowa funkcja. Jak elegancko zastosować to w Pandach? Chciałbym wprowadzić jakiś kod, ale nic, co mam, nie jest nawet poprawne. Jest to sytuacja, w której nie wiem, czego nie wiem ... Pandy ustawiły logikę dla skrzyżowania i unii, ale nic dla rozłącznej/ustalonej różnicy.

Dzięki!

Odpowiedz

8

Można użyć set.symmetric_difference funkcję:

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']) 
+0

Dzięki, to działało fantastycznie! – JPKab

0

Oto rozwiązanie dla wielu kolumn, prawdopodobnie nie bardzo wydajny, chciałbym uzyskać pewne informacje zwrotne na przeprowadzenie tej szybsze:

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