在NumPy和Pandas中,
nan != nan
和NaT != NaT
。因此,在单元测试期间比较结果时,如何断言返回值是其中之一?一个简单的assertEqual
自然会失败,即使我使用pandas.util.testing
。nan != nan
和NaT != NaT
。因此,在单元测试期间比较结果时,如何断言返回值是其中之一?一个简单的assertEqual
自然会失败,即使我使用pandas.util.testing
。如果你要比较标量,一种方法是使用assertTrue
和isnull
。例如,在DataFrame单元测试(pandas/tests/test_frame.py
)中,你可以找到像这样的测试:
self.assertTrue(com.isnull(df.ix['c', 'timestamp']))
(com
是 pandas/core/common.py
的别名,因此 com.isnull
调用与 pd.isnull
相同的基础函数。)
另一方面,如果您要比较具有空值的 Series 或 DataFrame 是否相等,则可以使用 tm.assert_series_equal
和 tm.assert_frame_equal
自动处理这些情况。例如:
>>> import pandas.util.testing as tm
>>> df = pd.DataFrame({'a': [1, np.nan]})
>>> df
a
0 1
1 NaN
NaN
不等于 NaN
:>>> df == df
a
0 True
1 False
但是assert_frame_equal
处理NaN
时会将其视为等于自身:
>>> tm.assert_frame_equal(df, df)
# no AssertionError raised
None
,它本应作为一种类型中立的值,但另一个唯一的标量,比如零或字符串(例如 "INCORRECT!!!1!1!"
;-) ),现在已经足够好了。 - Berislav Lopacassert_frame_equal
已经断言了NaN
等于NaN
。使用fillna()
将NaN
替换为其他标量进行比较是多余的,因此在Pandas的单元测试中不会使用。 - Alex Rileyassert_frame_check
之前调用了 fillna
,所以我错过了它可以解决差异的事实。谢谢! - Berislav Lopac在 Python2.7 上进行测试,我得到了以下结果:
import numpy as np
import pandas as pd
x = np.nan
x is np.nan #True
x is pd.NaT #False
np.isnan(x) #True
pd.isnull(x) #True
y = pd.NaT
y is np.nan #False
y is pd.NaT #True
np.isnan(y) #TypeError !!
pd.isnull(y) #True
x != x #True for nan
y != y #True for NaT
但我并不是很喜欢这种风格,我总是无法完全相信它。
isnull
函数。 - EdChum