熊猫“只能比较标记相同的DataFrame对象”错误


72

我正在使用Pandas比较加载到两个数据帧(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对象。如果前两个比较好,第三个有什么问题?

谢谢


1
使用后有这个问题pd.concat,回答这个问题的帮助
阿扎特Ibrakov

Answers:


67

这是一个小例子来说明这一点(仅适用于DataFrames,不适用于Series,直到Pandas 0.19都适用于两者):

In [1]: df1 = pd.DataFrame([[1, 2], [3, 4]])

In [2]: df2 = pd.DataFrame([[3, 4], [1, 2]], index=[1, 0])

In [3]: df1 == df2
Exception: Can only compare identically-labeled DataFrame objects

一种解决方案是先对索引进行排序(注意:某些函数需要对索引进行排序):

In [4]: df2.sort_index(inplace=True)

In [5]: df1 == df2
Out[5]: 
      0     1
0  True  True
1  True  True

注意:对列的顺序==也很敏感,因此您可能必须使用sort_index(axis=1)

In [11]: df1.sort_index().sort_index(axis=1) == df2.sort_index().sort_index(axis=1)
Out[11]: 
      0     1
0  True  True
1  True  True

注意:这仍然可以提高(如果排序后索引/列的标签不相同)。


sort_index将我的数据框更改为非类型。这将我从“ ValueError:只能比较标记相同的Series对象”得到的错误更改为“ AttributeError:'NoneType'对象没有属性'join'”。
R. Cox

2
@ R.Cox我猜您正在做类似的事情df = df.sort_index(inplace=True),如果就地使用,则不需要df = ,它会修改/更新df DataFrame /变量,并且表达式返回None。
安迪·海登

35

如果不需要进行比较,也可以尝试删除索引列:

print(df1.reset_index(drop=True) == df2.reset_index(drop=True))

我在单元测试中使用了相同的技术,如下所示:

from pandas.util.testing import assert_frame_equal

assert_frame_equal(actual.reset_index(drop=True), expected.reset_index(drop=True))

3
上帝祝福你。我正在努力解决类似行无法在不同DataFrame之间进行比较的问题,并且删除索引允许它执行比较。
Btc来源

您可以考虑添加inplace=True以确保索引保持静态以进行下游比较。
amc

当以上答案没有时,这会有所帮助。谢谢!:)
乔·里维拉

4

在问这个问题时,Pandas中没有另一个函数可以测试相等性,但是它是在不久前添加的: pandas.equals

您可以这样使用它:

df1.equals(df2)

一些区别于==

  • 您没有得到问题中描述的错误
  • 它返回一个简单的布尔值。
  • 相同位置的NaN值被视为相等
  • 2个DataFrame必须具有相同的值dtype才能视为相等,请参阅此stackoverflow问题

0

比较两个DataFrame时,必须确保第一个DataFrame中的记录数与第二个DataFrame中的记录数匹配。在我们的示例中,两个DataFrame中的每个都有4条记录,其中包含4种产品和4种价格。

例如,如果一个DataFrame具有5个产品,而另一个DataFrame具有4个产品,而您尝试运行比较,则会得到以下错误:

ValueError:只能比较标记相同的Series对象

这应该工作

import pandas as pd
import numpy as np

firstProductSet = {'Product1': ['Computer','Phone','Printer','Desk'],
                   'Price1': [1200,800,200,350]
                   }
df1 = pd.DataFrame(firstProductSet,columns= ['Product1', 'Price1'])


secondProductSet = {'Product2': ['Computer','Phone','Printer','Desk'],
                    'Price2': [900,800,300,350]
                    }
df2 = pd.DataFrame(secondProductSet,columns= ['Product2', 'Price2'])


df1['Price2'] = df2['Price2'] #add the Price2 column from df2 to df1

df1['pricesMatch?'] = np.where(df1['Price1'] == df2['Price2'], 'True', 'False')  #create new column in df1 to check if prices match
df1['priceDiff?'] = np.where(df1['Price1'] == df2['Price2'], 0, df1['Price1'] - df2['Price2']) #create new column in df1 for price diff 
print (df1)

来自https://datatofish.com/compare-values-dataframes/的示例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.