2016-02-29 17 views
0

我正在比較兩個表並在一列字符串上執行聯接。但是,我想創建一個表格,顯示連接中丟失的任何行,因爲匹配無效。見下面的例子。表列出了在連接期間丟失的東西(SQL或Pandas)?

Input: 
Table 1      Table 2 
    A  B  C     A  B C 
'..' '..' 'c'    '..' '..' 'c' 
'..' '..' 'd'    '..' '..' 'd' 
'..' '..' 'e'    '..' '..' 'f' 

然後加入對C列後,所產生的非匹配的表會是什麼樣子

Output: 
A  B  C 
'..' '..' 'e/f' 

我真的不關心,如果它是E或F是在結果表。我只需要其中一個。

有誰知道可以實現這一目標的SQL/Python(Pandas)代碼嗎?謝謝!

回答

1

使用SQL,您可以使用左外連接。這會給你的所有記錄在表1中,只有那些在表2匹配,因此在表1中沒有比賽將有C列NULL在相應表2

SELECT t1.* FROM `Table 1` t1 LEFT OUTER JOIN `Table 2` t2 
ON t1.C = t2.C 
WHERE t2.C IS NULL; 

對於記錄你的榜樣,這應該給:

A  B  C 
'..' '..' 'e' 
1
df1 = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6], 'C': ['c', 'd', 'e']}) 
df2 = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6], 'C': ['c', 'd', 'f']}) 

df1.merge(df2, how='left', on='C') 
    A B C a b 
0 1 4 c 1 4 
1 2 5 d 2 5 
2 3 6 e NaN NaN 

由於要合併上C列,從df2C列中的任何值,是不是在列的df1C不會在勒英尺合併組。

您可以使用tilda(~)否定運算符並執行布爾過濾器。

>>> df2[~df2.C.isin(df1.C)] 
    C a b 
2 f 3 6