将大熊猫数据框与csv文件进行比较的最佳方法
问题描述:
我有许多测试需要将熊猫数据框输出与静态基准文件进行比较。基准文件格式的首选选项是csv格式,因为它在Git中的可读性和易维护性。但如果我加载csv文件到一个数据帧,并使用将大熊猫数据框与csv文件进行比较的最佳方法
A.equals(B)
其中A为输出数据帧和B是从CSV文件中加载的数据帧,难免会有作为CSV文件中不存在错误记录数据类型和什么。所以我相当有意思的解决方案是将数据帧A写入一个CSV文件,并以与B相同的方式加载它,然后询问它们是否相等。
有没有人有更好的解决方案,他们已经使用了一段时间没有任何问题?
答
我遇到了一个解决方案,通过使用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.")
答
轻松地比较dataframes
如果你所担心的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())
现在比较这两个散列值,它们只是整数来检查原始数据帧是否相同。
但请注意:我不确定原始数据框的数据类型是否重要。一定要检查一下。
答
(A != B).any(1)
返回布尔值的系列,它告诉你哪些行都是平等的,哪些不是?
布尔值内部由1和0的代表,所以你可以做一个总和()来检查有多少行不相等。
sum((A != B).any(1))
如果你得到0的输出,那就意味着所有的行都是相等的。
尝试寻找在两个dataFrames,输出数据帧,并且您使用从CSV加载之间的区别:(!(A = B).ANY(1))''和让我知道,如果这作品,我无法测试这个自己,因为重新创建你的情况并不容易 –
谢谢。我可以问一下总和((A!= B).any(1))是做什么的?我得到1的输出。你在逐行比较吗? – Spinor8