pandas.DataFrame.equals的合同

我有一个函数的简单测试用例,它返回一个可能包含NaN的df。 我正在测试产量和预期产量是否相等。

>>> output
Out[1]: 
      r   t  ts  tt  ttct
0  2048  30   0  90     1
1  4096  90   1  30     1
2     0  70   2  65     1

[3 rows x 5 columns]
>>> expected
Out[2]: 
      r   t  ts  tt  ttct
0  2048  30   0  90     1
1  4096  90   1  30     1
2     0  70   2  65     1

[3 rows x 5 columns]
>>> output == expected
Out[3]: 
      r     t    ts    tt  ttct
0  True  True  True  True  True
1  True  True  True  True  True
2  True  True  True  True  True

但是,我不能简单地依靠==运算符,因为NaN。 我的印象是,解决这个问题的恰当方法是使用equals方法。 从文档:

pandas.DataFrame.equals
DataFrame.equals(other)
Determines if two NDFrame objects contain the same elements. NaNs in the same location are considered equal.

但是:

>>> expected.equals(log_events)
Out[4]: False

稍微挖一下就会发现帧中的差异:

>>> output._data
Out[5]: 
BlockManager
Items: Index([u'r', u't', u'ts', u'tt', u'ttct'], dtype='object')
Axis 1: Int64Index([0, 1, 2], dtype='int64')
FloatBlock: [r], 1 x 3, dtype: float64
IntBlock: [t, ts, tt, ttct], 4 x 3, dtype: int64
>>> expected._data
Out[6]: 
BlockManager
Items: Index([u'r', u't', u'ts', u'tt', u'ttct'], dtype='object')
Axis 1: Int64Index([0, 1, 2], dtype='int64')
IntBlock: [r, t, ts, tt, ttct], 5 x 3, dtype: int64

强制输出float块为int,或强制所需的int块浮动,并通过测试。

显然,有不同的平等意义, DataFrame.equals执行的测试在某些情况下可能会有用。 尽管如此, ==DataFrame.equals之间的差距令我感到沮丧,似乎是一种不一致。 在伪代码中,我期望它的行为匹配:

(self.index == other.index).all() 
and (self.columns == other.columns).all() 
and (self.values.fillna(SOME_MAGICAL_VALUE) == other.values.fillna(SOME_MAGICAL_VALUE)).all().all()

但是,它没有。 我的想法是错的吗?还是这是Pandas API中的不一致? 此外,鉴于NaN可能存在,我应该为我的目的进行哪些测试?


.equals()完成它所说的。 它测试元素间的精确相等,nans(和NaTs)的定位,dtype相等和索引相等。 可以认为这是因为df is df2类型的测试,但它们不必实际上是相同的对象,IOW, df.equals(df.copy())始终为真。

你的例子失败,因为不同的dtypes不相等(尽管它们可能是等价的)。 所以你可以使用com.array_equivalent ,或者(df == df2).all().all()如果你没有nans

这是对np.array_equal的替换,对于nan位置检测(和对象dtypes), np.array_equal被打破。

它主要用于内部。 这就是说,如果你喜欢增强等价性(例如元素在== sense和nan位置匹配中是等价的),请在github上打开一个问题。 (甚至更好地提交PR!)

链接地址: http://www.djcxy.com/p/82215.html

上一篇: contract of pandas.DataFrame.equals

下一篇: Register certificate to SSL port