将Pandas数据帧与csv文件进行比较的最佳方法

时间:2017-07-19 15:47:29

标签: python pandas csv dataframe comparison

我有许多测试需要将Pandas数据帧输出与静态基线文件进行比较。基线文件格式的首选选项是csv格式,因为它在Git中具有可读性和易维护性。但是如果我要将csv文件加载到数据帧中,并使用

A.equals(B) 

其中A是输出数据帧,B是从CSV文件加载的数据帧,不可避免地会出现错误,因为csv文件不记录数据类型和什么不是。所以我设计的解决方案是将数据帧A写入CSV文件并以与B相同的方式加载回来然后询问它们是否相等。

有没有人有一个更好的解决方案,他们已经使用了一段时间没有任何问题?

3 个答案:

答案 0 :(得分:0)

如果您担心csv文件的数据类型,可以将其作为具有特定数据类型的数据框加载,如下所示:

import pandas as pd
B = pd.DataFrame('path_to_csv.csv', dtypes={"col1": "int", "col2": "float64", "col3": "object"} )

这将确保csv的每一列都被读取为特定数据类型

之后,您可以使用

轻松比较数据框
A.equals(B)

修改

如果你需要比较很多对,另一种方法是比较数据帧的哈希值,而不是比较各个数据帧的每一行和每一行

hashA = hash(A.values.tobytes())
hashB = hash(B.values.tobytes())

现在比较这两个只是整数的哈希值,以检查原始数据帧是否相同。

请注意:我不确定原始数据框的数据类型是否重要。一定要检查一下。

答案 1 :(得分:0)

(A != B).any(1)返回一个带有布尔值的Series,它告诉你哪些行相等以及哪些行不相等......

布尔值在内部由1和0表示,因此您可以执行求和()来检查有多少行不相等。

sum((A != B).any(1))

如果输出为0,则意味着所有行都相等。

答案 2 :(得分:0)

我通过使用Pandas测试实用程序找到了适合我案例的解决方案。

from pandas.util.testing import assert_frame_equal

然后在try区域中调用它,除了check_dtype设置为False的块。

try:
    assert_frame_equal(A, B, check_dtype=False)
    print("The dataframes are the same.")
except: 
    print("Please verify data integrity.")