assert_frame_equal 在断言失败时导出数据帧和差异

assert_frame_equal export dataframes and diff on failed assertion

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

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

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

如果我也可以将断言检查的结果保存在两个数据帧相同形状的对象中,那就太好了。我相信对于每个比较元素,这看起来像是一个带有布尔值 True/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())

I would like to export the dataframes upon failed assertion. How do I capture it?

try-except on AssertionError,然后对数据帧做任何你想做的事

It would be great if I could also save the results of the assertion check in an object of the same shape of the two dataframes. I believe that would look like a dataframe with boolean True/False for each compared element.

没有一种优雅的方法可以实现这一点。这无法使用 assert_frame_equal 完成。您可以 df1 == df2 但这不如 assert_frame_equal 提供的比较和报告那么复杂。例如,当且仅当两个数据帧具有相同的形状 相同的列名时它才有效。

如果您使用的是测试框架,您可能需要 re-raise 使用 raise 将测试标记为失败的异常。

import pandas as pd

df1 = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
df2 = pd.DataFrame({'a': [1, 3], 'b': [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

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