如何使用 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() 断言数据框中的所有值而不退出失败的主要内容,如果未能解决你的问题,请参考以下文章

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?