【问题标题】:Table that lists things lost during a join (SQL or Pandas)?列出连接过程中丢失的东西的表(SQL 或 Pandas)?
【发布时间】:2016-02-29 21:32:06
【问题描述】:

我正在比较两个表并对一列字符串执行连接。但是,我还想创建一个表,显示由于匹配无效而在连接中丢失的任何行。请参见下面的示例。

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) 代码吗?谢谢!

【问题讨论】:

    标签: python mysql join


    【解决方案1】:

    使用 SQL,您可以使用左外连接。这将为您提供表 1 中的所有记录,并且只有表 2 中匹配的记录,因此表 1 中不匹配的记录将在对应的表 2 中的列 C 中为 NULL。

    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'
    

    【讨论】:

      【解决方案2】:
      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 上进行合并,所以来自df2 的列C 中的任何不在df1 的列C 中的值都不会在左侧合并组中。

      您可以使用 tilda (~) 否定运算符并进行布尔过滤。

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

      【讨论】:

        猜你喜欢
        • 2013-01-25
        • 2019-01-22
        • 1970-01-01
        • 2020-05-10
        • 2013-07-07
        • 2021-07-31
        • 1970-01-01
        • 2016-06-22
        • 2017-02-26
        相关资源
        最近更新 更多