评估已排序 pandas 数据帧的相等性不符合预期

Evaluating equality of sorted pandas dataframes does not behave as expected

我想比较两个 pd.dataframes 是否相等:

foo = pd.DataFrame([['between', 1.5], ['between', 2], 
                    ['between', 2.0], ['within', 2.0]], 
                   columns=['Group', 'Distance'])

bar = pd.DataFrame([['between', 2], ['between', 1.5], 
                    ['within', 2.0], ['between', 2.0]], 
                   columns=['Group', 'Distance'])

就我而言,这两个数据帧是相同的,但我意识到 pandas 不同意,因为它们的顺序不同。我的想法是我可以排序然后重新索引

foo = foo.sort_values('Distance').reset_index(drop=True)
bar = bar.sort_values('Distance').reset_index(drop=True)

Pandas sort 由于数据帧的初始排序而给出不同的结果。事实上,他们并不认为是等价的:

foo.equals(bar)
False

我可以先在 Group 上排序,然后在 Distance 上排序,这会 return True,但是在处理更大的数据帧时,我担心必须每次明确定义排序规则。有没有更好的方法来比较两个不同顺序的数据帧?

这样你就可以让它们的计算结果为 True:

foo.sort_values(foo.columns.values.tolist()).reset_index(drop=True).equals(bar.sort_values(foo.columns.values.tolist()).reset_index(drop=True))

或者

foo = foo.sort_values(foo.columns.values.tolist()).reset_index(drop=True)
bar = bar.sort_values(foo.columns.values.tolist()).reset_index(drop=True)
foo.equals(bar)
True