如何对pandas.Dataframe的索引进行排序以通过pd.testing.assert_frame_equal

5vf7fwbs  于 2023-05-15  发布在  其他
关注(0)|答案(2)|浏览(135)

我正在使用pd.testing.assert_frame_equal来测试我编写的函数是否按预期工作,我得到了一个奇怪的错误:
当我比较以完全相同的方式打印的2个 Dataframe 时(我检查了np.array_equal(df1.values,df2.values)的值是否相同,所以我知道它们按照人类标准是相同的),它给了我一个Assert错误:

DataFrame.index values are different (90.0 %)
[left]:  Int64Index([0, 3, 6, 9, 12, 15, 18, 1, 4, 7, 10, 13, 16, 19, 2, 5, 8, 11, 14,
            17],
           dtype='int64')
[right]: RangeIndex(start=0, stop=20, step=1)

其中左是函数返回的 Dataframe ,右是我为测试创建的 Dataframe 。
这里有两个错误。首先,索引的类型不相等,这很奇怪,但可以通过执行以下操作轻松解决:

right.index = list(right.index)

here所示。第二个问题是左索引的顺序,因为在将该行代码添加到测试中之后,它仍然返回以下错误:

DataFrame.index values are different (90.0 %)
[left]:  Int64Index([0, 3, 6, 9, 12, 15, 18, 1, 4, 7, 10, 13, 16, 19, 2, 5, 8, 11, 14,
            17],
           dtype='int64')
[right]: Int64Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
            19],
           dtype='int64')

我正在测试的函数将数据框拆分成组,melts其中的一些,然后joins所有的数据框重新组合在一起。
我在函数内部使用sort_index来保持索引的有序性(它们应该是有序的),但是在我所做的打印中,它们在测试错误中显示为有序的(0,1,2,3...),正如你所看到的,它们不是有序的。
我也试过使用reindex和reset_index,但它们没有显示出任何区别(也许有一些隐藏的选项我没有尝试过,谁知道呢?)
最后一个问题是:我如何对DataFrame的索引进行排序,以便测试通过?

当在正确的文件和函数中使用时,sort_index允许测试通过

(我在改变一个副本,而不是正确的功能...)

sirbozc5

sirbozc51#

我无法在pandas 2.0.0+上复制您的问题

print(pd.__version__)
# 2.0.1

idx1 = pd.Index([0, 3, 6, 9, 12, 15, 18, 1, 4, 7, 10, 13, 16, 19, 2, 5, 8, 11, 14, 17], dtype='int64')
idx2 = pd.RangeIndex(start=0, stop=20, step=1)

df1 = pd.DataFrame(index=idx1).sort_index()
df2 = pd.DataFrame(index=idx2)

print(df1.index)
# Index([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], dtype='int64')
print(df2.index)
# RangeIndex(start=0, stop=20, step=1)

pd.testing.assert_frame_equal(df1, df2) # no error
wsxa1bj1

wsxa1bj12#

如果在测试的函数中正确使用了sort_index,它就会通过测试。
如果你修改了其他文件中的其他函数,你并没有改进你正在测试的函数,所以它不会通过测试

相关问题