Python 为什么在比较两个数据帧时会得到不同的结果?

Python 为什么在比较两个数据帧时会得到不同的结果?,python,pandas,dataframe,comparison,Python,Pandas,Dataframe,Comparison,我正在比较两个df,当使用.equals()时,它会给我False,但如果我将两个df附加在一起并使用drop\u duplicate()它不会给我任何信息。有人能解释一下吗?也许两个数据帧中的行顺序不一样?当对应于相同索引的行相同时,数据帧将相等TL;博士 这些是完全不同的操作,我从来没有想到它们会产生相同的结果 pandas.DataFrame.equals 将根据Pandas是否确定要比较的数据帧为“相同”返回布尔值。这意味着一个的索引与另一个的索引“相同”,一个的列与另一个的列“相同”,

我正在比较两个df,当使用
.equals()
时,它会给我
False
,但如果我将两个df附加在一起并使用
drop\u duplicate()
它不会给我任何信息。有人能解释一下吗?

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

TL;博士 这些是完全不同的操作,我从来没有想到它们会产生相同的结果

pandas.DataFrame.equals
将根据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
是否
等于
df0
,我们得到

df0.equals(df1)

False
即使所有元素都是相同的

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

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

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

True

pandas.DataFrame.drop\u重复项
比较行中的值,而不关心索引

因此,这两种方法产生相同的结果

df0.append(df2).drop_duplicates()


当I
append
(或
pandas.concat
)时,pandas将对齐列并将追加的数据框添加为新行。然后
drop\u duplicates
做这件事。但是,正是这些列的内在对齐使得我在上面使用
sort\u index
axis=1

所做的事情变得如此,难道“False”不意味着这两个数据集中没有重复的数据吗?因此,“drop_duplicate()”将不返回任何内容。您需要提供一个。我可以保证
.drop\u duplicates()
不应返回空数据帧,除非您从空数据帧开始,或者指定
keep=False
这个问题太广泛了。是的,我使用了'keep=False',只剩下列索引,不确定我是否做对了,晚餐后,我将尝试获取一个最小的可复制示例。@pyseek我认为“.equals()”中的“False”表示不同,而“True”表示两个文件是相同的,这一点非常清楚,唯一的问题是“drop.duplicates”的结果给了我重复的行,但我想找出两个df之间的差异(根据索引,即ID),这意味着如果它们是相同的,我想要一个空白的输出,如果有不同的,我想要看到差异,另一件事是我的数据非常混乱,每行一列包含不同的变量,这使得比较困难。更新,我发现了问题,EXCEL&csv自动将一些数字四舍五入,这样代码就无法发现差异,我已经修复了它。现在,在使用drop_duplicates()之后,它给了我有差异的行,但没有告诉我哪个列或哪个值不同,有什么方法可以做到这一点吗?(我有500个专栏,目前我只是手动查找差异)我建议发布一个新问题,询问如何识别差异所在。
df0.append(df1, sort=True).drop_duplicates()

   A  B
0  0  1
1  2  3