【问题标题】:Evaluating equality of sorted pandas dataframes does not behave as expected评估排序的 pandas 数据帧的相等性不符合预期
【发布时间】:2017-04-04 21:32:23
【问题描述】:

我想比较两个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'])

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

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

由于数据帧的初始排序,Pandas 排序会给出不同的结果。事实上,它们的评估结果并不等同:

foo.equals(bar)
False

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

【问题讨论】:

    标签: python pandas equality


    【解决方案1】:

    这样你可以让他们评估为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
    

    【讨论】:

    • 替代解决方案:(foo.sort_values(['Group', 'Distance']).values == bar.sort_values(['Group', 'Distance']).values).all()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多