如何修复。只能比较有相同标签的系列对象

794 阅读2分钟

在使用pandas时,你可能遇到的一个错误是。

ValueError: Can only compare identically-labeled DataFrame objects

当你试图比较两个pandas DataFrames,而索引标签或列标签不完全匹配时,就会发生这个错误。

下面的例子展示了如何在实践中解决这个错误。

如何重现该错误

假设我们有以下两个pandas DataFrames。

import pandas as pd

#define DataFrames
df1 = pd.DataFrame({'points': [25, 12, 15, 14],
                   'assists': [5, 7, 13, 12]})

df2 = pd.DataFrame({'points': [25, 12, 15, 14],
                    'assists': [5, 7, 13, 12]},
                     index=[3, 2, 1, 0])

#view DataFrames
print(df1)

   points  assists
0      25        5
1      12        7
2      15       13
3      14       12

print(df2)

   points  assists
3      25        5
2      12        7
1      15       13
0      14       12

请注意,列的标签是匹配的,但是索引的标签却不匹配。

如果我们试图比较这两个DataFrames,我们会收到一个错误。

#attempt to compare the DataFrames
df1 = df2

ValueError: Can only compare identically-labeled DataFrame objects

如何修复这个错误

我们可以用几种方法来解决这个错误。

方法1:比较DataFrames(包括索引标签)。

我们可以使用下面的语法来比较两个DataFrames,看它们是否完全匹配(包括索引标签)。

df1.equals(df2)

False

这告诉我们这两个DataFrames并不完全匹配(包括索引标签)。

方法2:比较DataFrames(忽略索引标签)

我们可以使用下面的语法来比较两个DataFrames,看它们是否完全匹配,同时完全忽略掉索引标签。

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

True

这告诉我们,这两个DataFrames完全匹配(不考虑索引标签)。

方法3:逐行比较DataFrames

我们可以使用下面的语法来逐行比较两个DataFrames,看看哪些行的值是匹配的。

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

      points	assists
0	True	   True
1	True	   True
2	True	   True
3	True	   True

这样我们就可以看到每一行中哪些值是匹配的。

其他资源

下面的教程解释了如何修复Python中的其他常见错误。

如何修复Pandas中的KeyError
如何修复。ValueError: 无法将浮点数NaN转换为整数
如何修复。ValueError:操作数不能与形状一起广播

The postHow to Fix:只能比较标记相同的系列对象出现在Statology上。