我使用Pandas来比较加载到两个 Dataframe (uat,prod)中的两个文件的输出:...
uat = uat[['Customer Number','Product']]
prod = prod[['Customer Number','Product']]
print uat['Customer Number'] == prod['Customer Number']
print uat['Product'] == prod['Product']
print uat == prod
The first two match exactly:
74357 True
74356 True
Name: Customer Number, dtype: bool
74357 True
74356 True
Name: Product, dtype: bool
对于第三个打印,我得到一个错误:只能比较具有相同标签的DataFrame对象。如果前两个比较正确,那么第三个有什么问题?
谢谢
8条答案
按热度按时间2ekbmq321#
这里有一个小例子来演示这一点(它只适用于DataFrame,而不适用于Series,直到Pandas 0.19才适用于两者):
一种解决方案是先sort the index(注:某些函数需要排序索引):
注意:
==
也是sensitive to the order of columns,因此您可能必须使用sort_index(axis=1)
:注意:这仍然可能引发(如果索引/列在排序后没有相同的标签)。
pn9klfpd2#
如果不需要比较索引列,也可以尝试删除该列:
我已经在单元测试中使用了相同的技术,如下所示:
zaqlnxep3#
在提出这个问题时,Pandas中还没有其他函数来测试相等性,但不久前添加了这个函数:
pandas.equals
您可以这样使用它:
与
==
的一些不同之处在于:dtype
才能被视为相等,请参见this stackoverflow question编辑:
正如@paperskilltrees回答中指出的,索引对齐很重要。除了那里提供的解决方案之外,另一个选择是在比较DataFrames之前先sort the index of the DataFrames。对于
df1
,那将是df1.sort_index(inplace=True)
。pprl5pva4#
比较两个DataFrame时,必须确保第一个DataFrame中的记录数与第二个DataFrame中的记录数相匹配。在我们的示例中,两个DataFrame中的每个都有4条记录,即4个产品和4个价格。
例如,如果其中一个DataFrame有5个产品,而另一个DataFrame有4个产品,并且您尝试运行比较,则会出现以下错误:
值错误:只能比较标签相同的系列对象
这应该行得通
https://datatofish.com/compare-values-dataframes/中示例
ru9i0ody5#
Flyingdutchman's answer是 * 伟大的 * 但 * 错误的 *:它使用
DataFrame.equals
,在您的情况下,它将返回False
,而您希望使用DataFrame.eq
,它将返回True
。看起来
DataFrame.equals
忽略了 Dataframe 的索引,而DataFrame.eq
使用 Dataframe 的索引进行对齐,然后比较对齐后的值。这就是quote的主要陷阱:以下是需要牢记的基本原则:数据对齐是固有的。2除非您明确地这样做,否则标签和数据之间的链接将不会断开。
正如我们在下面的例子中所看到的,数据对齐既不会被破坏,也不会被强制执行,除非有明确的请求。
1.未给出明确的对齐说明:
==
又名DataFrame.__eq__
,1.对齐已明确中断:第一个是
1.明确强制执行对齐:
DataFrame.eq
、DataFrame.sort_index()
、我的答案是Pandas版的
1.0.3
。zlwx9yxi6#
这里我展示了一个如何处理这个错误的完整例子。我已经添加了带零的行。你可以从csv或任何其他来源获得你的 Dataframe 。
pbwdgjma7#
我找到了我的案例中错误的来源:
问题是列名称列表意外地包含在另一个列表中。
请考虑以下示例:
问题是,您无法从视觉上区分坏的DataFrame和好的DataFrame。
svujldwt8#
在我的例子中,我只是在创建 Dataframe 时直接写入paramcolumns,因为来自一个sql查询的数据带有名称,而在另一个sql查询中没有名称