Pandas DataFrames 中的平等 - 列顺序很重要吗?

新手上路,请多包涵

作为单元测试的一部分,我需要测试两个 DataFrame 是否相等。 DataFrames 中列的顺序对我来说并不重要。然而,这对 Pandas 来说似乎很重要:

 import pandas
df1 = pandas.DataFrame(index = [1,2,3,4])
df2 = pandas.DataFrame(index = [1,2,3,4])
df1['A'] = [1,2,3,4]
df1['B'] = [2,3,4,5]
df2['B'] = [2,3,4,5]
df2['A'] = [1,2,3,4]
df1 == df2

结果是:

 Exception: Can only compare identically-labeled DataFrame objects

我相信表达式 df1 == df2 应该评估为包含所有 True 值的 DataFrame。显然,在这种情况下, == 的正确功能应该是什么值得商榷。我的问题是:是否有一种 Pandas 方法可以满足我的需求?也就是说,有没有一种方法可以进行忽略列顺序的相等比较?

原文由 jcrudy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 693
2 个回答

您可以使用 sort_index 对列进行排序:

 df1.sort_index(axis=1) == df2.sort_index(axis=1)

这将评估所有 True 值的数据框。


正如@osa 评论的那样,这对于 NaN 是失败的并且也不是特别健壮,在实践中可能建议使用类似于@quant 的答案的东西(注意:如果有问题,我们想要一个 bool 而不是 raise ):

 def my_equal(df1, df2):
    from pandas.util.testing import assert_frame_equal
    try:
        assert_frame_equal(df1.sort_index(axis=1), df2.sort_index(axis=1), check_names=True)
        return True
    except (AssertionError, ValueError, TypeError):  perhaps something else?
        return False

原文由 Andy Hayden 发布,翻译遵循 CC BY-SA 4.0 许可协议

最常见的意图是这样处理的:

 def assertFrameEqual(df1, df2, **kwds ):
    """ Assert that two dataframes are equal, ignoring ordering of columns"""
    from pandas.util.testing import assert_frame_equal
    return assert_frame_equal(df1.sort_index(axis=1), df2.sort_index(axis=1), check_names=True, **kwds )

当然参见 pandas.util.testing.assert_frame_equal 你可以传递的其他参数

原文由 Quant 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题