我正在比较两个 df,当使用 .equals()
时,它会给出 False
,但是如果我将两个 df 附加在一起并使用 drop_duplicate()
它没有给我任何东西。有人能解释一下吗?
最佳答案
TL;DR
这些是完全不同的操作,我从未期望它们会产生相同的结果。
pandas.DataFrame.equals
将返回一个 bool 值,具体取决于 Pandas 是否确定正在比较的数据帧“相同”。这意味着一个的索引与另一个的索引“相同”,一个的列与另一个的列“相同”,一个的数据与另一个的数据“相同”另一个。
参见docs
它不与pandas.DataFrame.eq
相同,它将返回 bool 值的数据帧。
设置
考虑这三个数据框
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
是否等于
到df0
,我们得到
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_index
和 axis=1
所做的事情。
关于python - 为什么比较两个数据帧时会得到不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58508089/