【问题标题】:Python vs SQL outer joins give different results. Why?Python 与 SQL 外连接给出了不同的结果。为什么?
【发布时间】:2018-12-01 08:28:21
【问题描述】:

我在理解 Python (Pandas) FULL OUTER JOINS 和 Microsoft SQL Server 之间的区别时遇到了一些麻烦。在不深入数据的情况下,也许有人了解它们如何发挥不同作用的理论。 我正在并行运行这两个代码,以确保它在我学习 Python 时能够正常工作。

SQL 代码:

SELECT *
FROM
    (
        SELECT *
        FROM df1 a
        FULL OUTER JOIN df2 b
        on a.id_no=b.idno
    ) abc
FULL OUTER JOIN df3 c
on abc.id_no=c.idno

Python 代码:

TripleMerge = df1.merge(df2, left_on='id_no', right_on=df2['idno'].astype(np.int64), how='outer').merge(
        df3, left_on='id_no', right_on=df3['idno'].astype(np.int64), how='outer')

每个连接的第一部分给了我相同的行数 (2323) 第二部分总共产生 4951 行 SQL 和 4552 行 Python。我想不通。

一些线索: 如果不转换 int64,Python 不会让我加入“idno”。 我以相同的方式对 SQL 和 Python 中的所有 dfs 进行排序以控制排序。

如果您能想到任何可以调查的地方,请告诉我。或者,如果您知道如何更好地编写 Python 代码(或完全不同的方式来测试行输出,请告诉我)。

谢谢!

【问题讨论】:

  • 更新:Python 是“正确”的。 SQL 代码更适合创建不同 IDno 的列表并执行 3 个左连接。 Python 通过从 IDno 或类似的东西创建索引来自动这样做

标签: python sql pandas join outer-join


【解决方案1】:

在您的 python 示例中没有与 abc 选择等效的选项。很确定你的语法有点偏离。

在 SQL Server 中,您是说进行此连接,然后将其连接到另一个表的值上。

试试这个:

pd.merge(pd.merge(df1,df2,left_on='id_no', right_on='idno', how='outer'),df3,left_on='id_no', right_on='idno',how= '外')

【讨论】:

  • 感谢建议的清理工作。不幸的是,这给了我与以前完全相同的代码。 SQL 版本仍然包含 399 额外的行。
猜你喜欢
  • 2013-03-24
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
相关资源
最近更新 更多