问题描述
我正在测试多个数据框的相等性。
pd.testing.assert_frame_equal(
df_py,df_mat,check_dtype=False,check_less_precise=True)
我想在断言失败时导出数据帧。 如何捕获它?
如果我也可以将断言检查的结果保存在两个数据框具有相同形状的对象中,那将是很好的。我相信对于每个比较的元素,它看起来都像一个布尔值为True / False的数据框。
解决方法
我想在断言失败时导出数据帧。如何捕获它?
try-except
在AssertionError
上,然后对数据框执行任何操作
如果我也可以将断言检查的结果保存在两个数据框具有相同形状的对象中,那将是很好的。我相信对于每个比较的元素,它看起来都像一个布尔值为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())