【问题标题】:Why get different results when comparing two dataframes?为什么比较两个数据帧时会得到不同的结果?
【发布时间】:2019-10-23 00:31:26
【问题描述】:

我正在比较两个 df,当使用 .equals() 时它给了我False,但是如果我将两个 df 附加在一起并使用 drop_duplicate() 它什么也没给我。有人可以解释一下吗?

【问题讨论】:

  • “假”不是意味着2个数据集中没有重复吗?因此“drop_duplicate()”不会返回任何内容。
  • 您需要提供minimal reproducible example。我可以保证.drop_duplicates() 不应该返回一个空的DataFrame,除非你从一个空的DataFrame 开始,或者指定keep=False
  • 这个问题太宽泛了。
  • 是的,我使用了 'keep=False',只剩下列索引,不确定我这样做是否正确,我会在晚餐后尝试获得一个最小的可重现示例。
  • @PySeeker 我认为 '.equals()' 中的 'False' 表示不同,而 ''True'' 表示两个文件相同

标签: python pandas dataframe comparison


【解决方案1】:

TL;DR

这些是完全不同的操作,我从没想过它们会产生相同的结果。

pandas.DataFrame.equals

将返回一个布尔值,具体取决于 Pandas 是否确定正在比较的数据帧是“相同的”。这意味着一个的索引与另一个的索引“相同”,一个的列与另一个的列“相同”,一个的数据与另一个的数据“相同”另一个。

docs

pandas.DataFrame.eq 相同,后者将返回布尔值的数据框。

设置

考虑这三个数据框

df0 = pd.DataFrame([[0, 1], [2, 3]], [0, 1], ['A', 'B'])
df1 = pd.DataFrame([[1, 0], [3, 2]], [0, 1], ['B', 'A'])
df2 = pd.DataFrame([[0, 1], [2, 3]], ['foo', 'bar'], ['A', 'B'])

df0              df1              df2      

   A  B             B  A               A  B
0  0  1          0  1  0          foo  0  1
1  2  3          1  3  2          bar  2  3

如果我们检查 df1 是否是 equalsdf0,我们得到

df0.equals(df1)

False

即使所有元素都相同

df0.eq(df1).all().all()

True

那是因为列没有对齐。如果我对列进行排序,那么......

df0.equals(df1.sort_index(axis=1))

True

pandas.DataFrame.drop_duplicates

比较行中的值,不关心索引。

所以,这两者产生相同的外观结果

df0.append(df2).drop_duplicates()

df0.append(df1, sort=True).drop_duplicates()

   A  B
0  0  1
1  2  3

当我append(或pandas.concat)时,Pandas 将对齐列并将附加的数据框添加为新行。然后drop_duplicates 做到了。但正是列的固有对齐方式完成了我在上面使用 sort_indexaxis=1 所做的事情。

【讨论】:

  • 谢谢,这个很清楚,唯一的就是'drop.duplicates'的结果给了我重复的行,但是我想找到两个df之间的区别(根据索引,即ID ),这意味着如果它们相同,我想要一个空白输出,如果有不同,我想看看有什么不同,另一件事是我的数据非常混乱,一列包含每一行的不同变量,这使得很难比较。
  • 更新,我发现了问题,EXCEL & csv 自动四舍五入了一些数字,所以代码无法发现差异,我已经修复了。现在使用 drop_duplicates() 后,它给了我有差异的行,但没有告诉我哪一列或哪个值不同,有没有办法做到这一点? (我有 500 列,目前我只是手动查找差异)
  • 我建议发布一个新问题,询问如何识别差异所在。
【解决方案2】:

也许两个数据框中的行的顺序不同?当对应相同索引的行相同时,数据帧将相等

【讨论】:

    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多