我正在尝试比较不同的数据库,并试图找出这些数据库内的表是否相同/相等。例如,我将其设置如下
数据库“ a”只有一个名为“ abc”的表 数据库“ b”只有一个名为“ abc”的表 数据库“ c”有两个名为“ abc”和“ xyz”的表
我编写了以下代码,执行后效果很好,但是从输出中可以看到 它都说是“假”。但是,如果您看到我的设置,则数据库“ a”和数据库“ b”只有一个相同的表,并且我希望它显示“ True”,但它显示“ false”,并且在您比较数据库“ b”和数据库“ c”时,它们不相同,因为数据库'c'有一个名为'xyz'的额外表,因此我希望它打印出正确的“ false”。 请让我知道我的代码有什么问题或是否可以解决。基本上我想做一个比较并比较两个数据库并检查它们是否具有相同的表?
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))
答案 0 :(得分:0)
由于您对数据框的值感兴趣,因此一种解决方案是将数据框转换为字典,然后检查值是否相同:
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.
答案 1 :(得分:0)
标题可能不同。 在比较
之前,尝试将标头设置为仅索引df1.columns = range(df1.shape[1])
df2.columns = range(df2.shape[1])
df3.columns = range(df3.shape[1])
在所有数据框中的列顺序相同的假设下
答案 2 :(得分:0)
尝试pd.testing.assert_frame_equal
:如果两个数据帧相等,则不返回任何内容;如果不相等,则引发AssertionError
。
它可以接收各种关键字参数来选择比较中要检查的内容(例如,如果您不想检查列名,则可以传递check_names=False
)。
还将明确指出数据帧在哪里不相等;不同的大小,不同的列名,不同的值-无论它是什么,它都会很明显。
试试看!