将大熊猫数据框与csv文件进行比较的最佳方法

问题描述:

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

A.equals(B) 

其中A为输出数据帧和B是从CSV文件中加载的数据帧,难免会有作为CSV文件中不存在错误记录数据类型和什么。所以我相当有意思的解决方案是将数据帧A写入一个CSV文件,并以与B相同的方式加载它,然后询问它们是否相等。

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

+0

尝试寻找在两个dataFrames,输出数据帧,并且您使用从CSV加载之间的区别:(!(A = B).ANY(1))''和让我知道,如果这作品,我无法测试这个自己,因为重新创建你的情况并不容易 –

+0

谢谢。我可以问一下总和((A!= B).any(1))是做什么的?我得到1的输出。你在逐行比较吗? – Spinor8

我遇到了一个解决方案,通过使用Pandas测试工具为我的案例工作。

from pandas.util.testing import assert_frame_equal 

然后从check_dtype设置为False的尝试除了块之外调用它。

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

如果你所担心的csv文件的数据类型,你可以加载它作为特定数据类型一个数据帧如下:

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

这将确保CSV中的每一列,读为特定数据类型

后,你可以只用

A.equals(B) 

轻松地比较dataframes

编辑:

如果你需要比较大量的对,另一种方式来做到这将是代替比较比较各行和各列数据的dataframes的哈希值的帧

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

现在比较这两个散列值,它们只是整数来检查原始数据帧是否相同。

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

+0

感谢您的建议。我过去做过,但随着测试文件数量的增加,这种方法效率不高。 – Spinor8

+0

你需要在你的python代码中比较它们吗? – Ankur

+0

是的。我有几个用例。 1)用于测试2)验证内存数据框和csv文件之间的现有数据是否相同。 – Spinor8

(A != B).any(1)返回布尔值的系列,它告诉你哪些行都是平等的,哪些不是?

布尔值内部由1和0的代表,所以你可以做一个总和()来检查有多少行不相等。

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

如果你得到0的输出,那就意味着所有的行都是相等的。