【问题标题】:how to compare databases with tables using pandas如何使用 pandas 将数据库与表进行比较
【发布时间】:2020-06-10 11:07:40
【问题描述】:

我正在尝试比较不同的数据库并尝试确定这些数据库中的表是否相同/相等。比如我已经设置了如下

数据库“a”只有一个名为“abc”的表 数据库“b”只有一个名为“abc”的表 数据库“c”有两个名为“abc”和“xyz”的表

我编写了以下代码,执行时运行良好,但从输出中可以看出 它说两者都是“假的”。但是如果你看到我的设置,数据库'a'和数据库'b'只有一个相同的表,我希望它打印“真”但它打印“假”,当你比较数据库'b'和数据库'c'时,它们不相同,因为数据库“c”有一个名为“xyz”的额外表,所以我希望它打印“假”,这是正确的。 请让我知道我的代码有什么问题或者是否有解决方法。基本上我想做一个差异并比较两个数据库并检查它们是否具有相同的相同表?

import pandas as pd
import mysql.connector
mydb1 = mysql.connector.connect(host="localhost", user="xxxxxxxx", passwd="xxxxxxxx", database="a")
mydb2 = mysql.connector.connect(host="localhost", user="xxxxxxxx", passwd="xxxxxxxx", database="b")
mydb3 = mysql.connector.connect(host="localhost", user="xxxxxxxx", passwd="xxxxxxxx", database="c")
querystmt1 = "SHOW TABLES"
querystmt2 = "SHOW TABLES"
querystmt3 = "SHOW TABLES"
df1 = pd.read_sql(querystmt1, mydb1)
df2 = pd.read_sql(querystmt2, mydb2)
df3 = pd.read_sql(querystmt3, mydb3)
print(df1)
print(df2)
print(df3)
print(df1.equals(df2))
print(df2.equals(df3))

【问题讨论】:

    标签: python mysql database pandas datatable


    【解决方案1】:

    由于您对数据帧的值感兴趣,因此解决方案是将数据帧转换为字典,然后检查值是否相同:

    df1 = pd.read_sql(querystmt1, mydb1)
    d1 = df1.to_dict()
    df2 = pd.read_sql(querystmt2, mydb2)
    d2 = df2.to_dict()
    df3 = pd.read_sql(querystmt3, mydb3)
    d3 = df3.to_dict()
    
    # Checking
    print(list(d1.values()) == list(d2.values()))  # True
    print(list(d2.values()) == list(d3.values()))  # False
    
    

    这不是计算效率最高的方法(包含大量类型转换),但如果它是一次性的就足够了。

    如果您想检查两个数据框是否包含至少一个共同值,那么您可以使用:

    print(any(i in list(d3.values()) for i in list(d2.values())))
    # The output is True since 'abc' is a table in both df2 and df3.
    

    【讨论】:

      【解决方案2】:

      标题可能不同。 在比较之前尝试将标头设置为仅索引

      df1.columns = range(df1.shape[1])
      df2.columns = range(df2.shape[1])
      df3.columns = range(df3.shape[1])
      

      假设所有数据帧中的列顺序相同

      【讨论】:

        【解决方案3】:

        尝试pd.testing.assert_frame_equal:如果两个数据帧相等,它将不返回任何内容,如果不相等,则会引发AssertionError

        它可以接收各种关键字参数来选择要在比较中检查的内容(例如,如果您不想检查列名,可以传递check_names=False)。

        它还将明确数据帧在哪里不相等;不同的大小,不同的列名,不同的值——不管它是什么,它都会是明确的。

        试一试!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-23
          • 2017-07-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多