assert_frame_equal导出数据帧和比较失败的断言

问题描述

我正在测试多个数据框的相等性

pd.testing.assert_frame_equal(
            df_py,df_mat,check_dtype=False,check_less_precise=True)

我想在断言失败时导出数据帧。 如何捕获它?

如果我也可以将断言检查的结果保存在两个数据框具有相同形状的对象中,那将是很好的。我相信对于每个比较的元素,它看起来都像一个布尔值为True / False的数据框。

解决方法

我想在断言失败时导出数据帧。如何捕获它?

try-exceptAssertionError上,然后对数据框执行任何操作

如果我也可以将断言检查的结果保存在两个数据框具有相同形状的对象中,那将是很好的。我相信对于每个比较的元素,它看起来都像一个布尔值为True / False的数据框。

没有一种完美的方法来实现这一目标。无法使用assert_frame_equal完成此操作。您可以进行df1 == df2,但是它不如assert_frame_equal提供的比较和报告那么复杂。例如,仅当两个数据框具有相同的形状相同的列名时,该方法才有效。

如果您使用的是测试框架,则可能需要使用raise重新引发异常,以将测试标记为失败。

import pandas as pd

df1 = pd.DataFrame({'a': [1,2],'b': [3,4]})
df2 = pd.DataFrame({'a': [1,3],5]})
try:
    pd.testing.assert_frame_equal(df1,df2,check_dtype=False,check_less_precise=True)
except AssertionError as e:
    print(e)
    print(df1 == df2)
    raise

以上将输出

DataFrame.iloc[:,0] (column name="a") are different

DataFrame.iloc[:,0] (column name="a") values are different (50.0 %)
[index]: [0,1]
[left]:  [1,2]
[right]: [1,3]
       a      b
0   True   True
1  False  False

最后的方法是手动迭代并比较两个数据帧中的每个值,但随后您需要确定输出的外观。

,

可以像处理异常一样简单吗?

import traceback
try:
    assert_frame_equal(df1,df2)
except AssertionError:
    df1.to_csv('df1.csv',index=False)
    df2.to_csv('df2.csv',index=False)
    with open('traceback.txt','w') as f:
        f.write(traceback.format_exc())