如何使用 assert_frame_equal() 断言数据框中的所有值而不退出失败
Posted
技术标签:
【中文标题】如何使用 assert_frame_equal() 断言数据框中的所有值而不退出失败【英文标题】:How to use assert_frame_equal() for asserting all the values in the dataframe without exiting on failure 【发布时间】:2022-01-13 02:14:16 【问题描述】:我是 python 和数据框的新手。我目前正在尝试将 2 个数据帧与 assert_frame_equal()
函数进行比较。
df1= a b
0 1 3
1 2 4
df2= a b
0 2 3.0
1 2 4.0
代码:
import pandas as pd
from pandas._testing import assert_frame_equal
def test_compare_src_trg():
df1 = pd.DataFrame('a': [1, 2], 'b': [3, 4])
df2 = pd.DataFrame('a': [2, 2], 'b': [3.0, 4.0])
pd.testing.assert_frame_equal(df1, df2)
运行时,断言在第一列失败,因为值“1”不等于“2”,这是正确的。但我希望断言在所有数据帧项目上运行并给出整体通过/失败结果。
----------------------------------
raise AssertionError(msg)
AssertionError: 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]: [2, 2]
Process finished with exit code 1
【问题讨论】:
看起来您的代码只是在顶层运行,而不是在测试函数中运行?既然你标记了这个pytest
,只需def test_whatever():
就足够了,然后调用pytest
来收集并执行它们...
嗨,我正在使用 def 测试函数进行断言。虽然在函数中有它,但当第一个数据帧值不同时,断言失败。我正在寻找的是运行所有断言,尽管它在第一个值处失败。
【参考方案1】:
我认为您必须使用 compare
之类的其他内容。如果结果 Dataframe 为空,您可以查看完整的比较并断言以检查它们是否相等。
cp = df1.compare(df2)
# a
# self other
# 0 1.0 2.0
assert cp.empty, "Dataframes are not equal"
# AssertionError: Dataframes are not equal
注意
只能比较具有相同标签(即相同形状、相同行和列标签)的 DataFrames
【讨论】:
嗨@Romain,我的列不一样。我的意思是在 df2 中,可能有 n 行与 df1 不同。有没有办法可以比较两个数据框以上是关于如何使用 assert_frame_equal() 断言数据框中的所有值而不退出失败的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]