【问题标题】:Pandas DataFrame equality - index numberingPandas DataFrame 相等 - 索引编号
【发布时间】:2016-01-18 08:06:36
【问题描述】:

索引编号在测试数据框是否相等时是否重要?我有 2 个相同的数据框,具有完全相同的数据和列。唯一的区别是每行的索引号不同,equals 方法返回 False。我怎样才能解决这个问题?这是我的数据框

   A   B
0  87  54
1  87  75
2  87  22
3  87  69

     A   B
418  87  69
107  87  54
108  87  75
250  87  22

【问题讨论】:

标签: python python-2.7 pandas


【解决方案1】:

您可以使用np.array_equal 检查值,但是顺序很重要,因此在您的示例中,您必须先按索引排序。

In [11]: df1
Out[11]:
    A   B
0  87  54
1  87  75
2  87  22
3  87  69

In [12]: df2
Out[12]:
      A   B
418  87  69
107  87  54
108  87  75
250  87  22

In [13]: df3 = df2.sort()

In [14]: df3
Out[14]:
      A   B
107  87  54
108  87  75
250  87  22
418  87  69

In [15]: np.array_equal(df1, df3)
Out[15]: True

注意:您无法比较 df1 和 df2,因为它们具有不同的索引:

In [21]: df1 == df2
ValueError: Can only compare identically-labeled DataFrame object

您可以重置索引,但请注意,可能会因此引发异常:

In [22]: df3.reset_index(drop=True)
Out[22]:
    A   B
0  87  54
1  87  75
2  87  22
3  87  69

In [23]: np.all(df1 == df3.reset_index(drop=True))
Out[23]: True

另一种选择是尝试并在assert_frame_equals 附近进行除块:

In [24]: pd.util.testing.assert_frame_equal(df1, df3.reset_index(drop=True))

就像这个related answer

正如 Jeff 指出的,您可以使用 .equals,它会这样做:

In [25]: df1.equals(df3.reset_index(drop=True))
Out[25]: True

【讨论】:

  • check_names=False 由于某种原因在这里不起作用。排序思路不错!我正在试用它们并将发布更新(并接受您的回答)
  • check_names 检查我认为的索引名称,这不会影响您的情况,因为您没有任何索引名称。
  • 哦,你的意思是重置索引后使用assert?如果不删除索引,它将无法工作。
  • @AndyHayden 我们已经有一段时间了.equals(...) :)
  • @Jeff 不知道我在制表符之前完成时是怎么错过的! :)
猜你喜欢
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2019-04-13
  • 2018-06-18
  • 2015-05-04
  • 2016-02-18
  • 2021-03-07
  • 2016-01-31
相关资源
最近更新 更多