Pandas索引对象与不同dtypes和元素的相等性

时间:2016-05-25 17:46:31

标签: pandas

任何人都可以解释为什么在Pandas(0.18.0)中评估为真:

>>> import pandas as pd

>>> pd.DatetimeIndex(['1971-10-01'], dtype='datetime64[ns]', 
        freq=None).equals(pd.Index([u'100171'], dtype='object'))
True

这些索引对象具有不同的元素和不同的dtypes。它们的机制是一样的吗?

(我看到1971-10-01的日期可以用mmddyy格式写成100171。这不应该有资格获得平等。)

如何编写比较两个数据帧的断言

df1 = pd.DataFrame([1], columns=pd.DatetimeIndex(['1971-10-01'], 
    dtype='datetime64[ns]', freq=None)
df2 = pd.DataFrame([1], columns=pd.Index(['100171'], dtype='object')
assert df1.equals(df2)  # this assertion succeeds!?

失败,因为索引实际上是不同的?

1 个答案:

答案 0 :(得分:3)

这实际上是病态案例。

In [1]: i1 = pd.DatetimeIndex(['1971-10-01'], dtype='datetime64[ns]', freq=None)

In [2]: i2 = pd.Index([u'100171'], dtype='object')

In [3]: i1
Out[3]: DatetimeIndex(['1971-10-01'], dtype='datetime64[ns]', freq=None)

In [4]: pd.DatetimeIndex(i2)
Out[4]: DatetimeIndex(['1971-10-01'], dtype='datetime64[ns]', freq=None)

.equals尝试强制转换为相同类型,例如字符串被强制转换(如果可能);在这种情况下,他们真的是平等的。

我创建了一个问题here,如果有人想查看我们是否可以删除此类案例。